我知道Future将在事件队列中运行,但是事件队列也在主隔离中运行,如果将来我执行一些繁重的任务(例如,计算总和从1到1000000),它将阻塞我的ui代码。 但是Future在网络操作中将不会阻止ui(例如await httpClient.getUrl(uri))。 为什么使用future的网络请求会花费几秒钟而不会阻塞UI,而计算操作会阻塞UI?
@override
void initState() {
super.initState();
Future((){
var result;
for (var i = 0; i < 1000000; ++i) {
result = 'result is $i';
}
print(result);
});
}
如果我在initState()中使用Future做一些繁重的工作,则用户界面将被阻止。
答案 0 :(得分:1)
Dart中的隔离是单线程的。隔离者一次只能做某事。
异步功能基本上是cooperative multitasking的一种形式。函数必须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);
});
然后,您应该发现UI可以定期处理事件,并且外观应该保持响应状态。 (请注意,由于额外的额外开销,您的计算将花费更长的时间。)