我知道 Future 将在事件队列中运行。但是事件队列也在主隔离上运行,如果我将来执行一些繁重的任务(例如,计算从 1 到 1000000 的总和),它将阻塞我的 ui 代码。 \n但是 Future 在网络操作不会阻塞UI(如await httpClient.getUrl(uri))。\n为什么使用future的网络请求需要几秒钟而不阻塞UI,而计算操作会阻塞UI\xef\xbc\x9f
\n\n@override\nvoid initState() {\nsuper.initState();\nFuture((){\n var result;\n for (var i = 0; i < 1000000; ++i) {\n result = 'result is $i';\n }\n print(result);\n});\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n如果我在 initState() 中使用 Future 执行一些繁重的任务,用户界面将被阻止。
\nDart 中的隔离是单线程的。孤立体一次只能做一件事。
异步函数基本上是协作多任务处理的一种形式。函数必须产生(通常通过await)以允许其他操作在隔离中执行。
您的计算不会产生结果,因此它必须在 UI 恢复处理事件之前完整运行,并且 UI 将无响应。如果你改变了它:
Future(() async {
var result;
for (var i = 0; i < 1000000; ++i) {
result = 'result is $i';
await Future.delayed(Duration.zero);
}
print(result);
});
Run Code Online (Sandbox Code Playgroud)
那么您应该会发现 UI 可以定期处理事件,并且应该具有保持响应的外观。(请注意,由于额外的开销,您的计算将需要更长的时间才能完成。)
| 归档时间: |
|
| 查看次数: |
1533 次 |
| 最近记录: |