考虑以下程序:
import 'dart:async';
Stream<int> counter() async* {
for (int i = 0; true; i++) {
await Future.delayed(const Duration(seconds: 1));
print('counter $i');
yield i;
}
}
Future<void> main() async {
await for (var value in counter()) {
print(value);
if (value == 5) {
break;
}
}
// continue to do stuff
}
这将打印以下内容:
counter 0
0
counter 1
1
counter 2
2
counter 3
3
counter 4
4
counter 5
5
counter 6
事实是,由
counter()
创建的流实际上从未完成。似乎在第六步阻止了yield
。这是否意味着我有潜在的内存泄漏?还是dart知道不再听过此流并且不再引用它了?因此正确释放资源?
最佳答案
按照书面规定,您不应有任何内存泄漏。
当await for
循环中断时,它将取消流订阅。这将在下一个counter
处退出yield
函数(async*
函数检查是否已在yield
处将其取消,如果是,则将其替换为return
)。
如果要在取消流时进行清理,可以在代码周围添加try {} finally {}
。 finally块将运行,就像yield
是正常的return;
一样。在继续之前,由cancel
循环导出调用的await for
操作应等待清理完成(以便async*
函数正确返回)。
当函数返回时,没有计时器在运行,流订阅被取消,没有人卡在任何东西上。
关于dart - 当没有更多引用时,async *流会自动关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021720/