簡體   English   中英

我在 Flutter/Dart 異步代碼執行方面遇到問題,就像它是如何工作的一樣

[英]I am having a problem with Flutter/Dart Async code execution, as in how does it work

在 Flutter 中,我們使用異步等待和 Future,有人可以解釋一下,如果我們不使用另一個線程(我們不能在 dart 中)並且只在主 UIThread 上運行作業,應用程序不會變得不穩定,因為即使我們是等待作業執行它最終只會在 UIThread 上執行。 我也在某個地方讀到過有關隔離的文章。 但無法描繪出確切的畫面。 如果有人能詳細解釋一下。

我認為您在 Dart 的異步方法中遺漏了一些東西。 Dart is a single threaded programming language, Java or C# are multi-threaded programming languages, forget async as a new thread, it doesn't happen in Dart. Dart 是一種單線程編程語言。 這意味着 Dart 一次只能運行一條指令,而 Java 可以同時運行多條指令。

通常,您在 Dart 中所做的一切都將從 UI-Thread 開始。 無論您在 Dart 中調用什么方法,無論是使用同步、異步,它們都將在 UI-Thread 上運行,因為 Dart 是單線程。 在像 Javascript 和 Dart 這樣的單線程語言中,異步方法不是並行執行的,而是遵循事件循環處理的常規事件序列。 如果您在多線程語言中運行以下代碼,其中 fetch 將需要一些時間來執行,那么存在一些問題(我會說方法,如下所示):

String user = new Database.fetch(David);
String personalData = new Database.fetch(user);

您將在 user 中收到 David 的數據,之后,您將收到您的數據。 這將鎖定您的 UI,並且對於像 Java 這樣的語言有線程,您可以使用它在后台執行此任務,在另一個線程上,並且 UI 線程將順利運行。

如果您在 Dart 執行此操作

String user = new Database.fetch(David);
String personalData = new Database.fetch(user);

user 將是個人數據中的 null,因為 fetch 事件是 Future。

如何在 Dart 中解決這個問題?

String user = await Database.fetch(David);
String personalData = await Database.fetch(user);

對於那些喜歡更實用的范例(我不喜歡它)的人,您可以使用它。

Database.fetch(David).then((user){
Database.fetch(user).then((personal){
String personalData = personal;
});
});

但是,假設您在該數據庫中有數十億數據,這項繁重的任務可能會導致屏幕上的動畫凍結,並且您會在用戶的 UI 中看到卡頓,因為隔離是發明的。

Dart 隔離為您提供了一種在 Dart 中執行真正多線程的方法。它們有自己獨立的堆(內存),並在后台運行代碼,就像多線程語言的線程一樣。 我可以解釋隔離是如何工作的,但它會使這個響應非常大,目標只是區分異步/多線程方法。

使用隔離解決上述問題的方法很簡單,就是使用計算。

創建計算是為了促進隔離的創建,您只需傳遞 function 和 function 將執行的數據,就是這樣,重要的是要記住計算是未來。 所以你必須使用 await 或 then 來獲得它的結果。

在我們的示例中,我們可以創建一個新線程並在完成調用計算后獲取它的結果,如下所示:

String user = await compute(Database.fetch,David);
String personalData = await compute(Database.fetch,user);

很簡單,不是嗎?

簡歷:等待一段時間才能完成的一切,在dart中被稱為“未來”。 要等待未來的結果填充變量,請使用 await 或 then。 用於從 Future 獲取結果的異步方法(await 和 then)在主線程上執行,因為 Dart 是單線程的。 如果你想在一個新線程上運行任何 function,你可以創建一個隔離。 Dart 提供了一個易於使用的隔離包裝器,稱為計算,您只需要傳遞一個將要處理的方法和將要處理的數據,它會在將來返回所有結果。

  • 注意:如果您要使用計算,請確保您使用的是 static 或頂級方法(請參閱在我使用 Database.fetch 的示例中,如果您需要調用 Database().fetch 或需要創建它的一個實例,意味着它不是 static 方法,並且不適用於隔離)。

英語不是我的第一語言,因此我不想寫太多,但我希望我能幫助區分多線程異步編程和單線程異步編程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM