考虑此程序:
next
这将打印以下内容:
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
创建的流实际上从未结束。似乎在第6步在counter()
处被阻止。
这是否意味着我可能存在内存泄漏?还是dart理解不再听这个流并且不再引用它了?因此可以正确释放资源?
答案 0 :(得分:2)
按照书面规定,您不应有任何内存泄漏。
await for
循环中断时,它将取消流订阅。它将在下一个counter
处退出yield
函数(async*
函数检查它是否在yield
处被取消,如果是,则它充当{{1 }})。
如果要在取消流时进行清理,可以在代码周围添加return
。最终块将运行,就像try {} finally {}
是正常的yield
一样。由return;
循环退出调用的cancel
操作 在继续之前要等待清理完成(以使await for
函数正确返回)。
函数返回时,没有计时器在运行,流订阅被取消,并且没有人挂在任何东西上。