当没有更多参考时,async *流会自动关闭吗?

时间:2018-08-25 22:30:10

标签: dart

考虑此程序:

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理解不再听这个流并且不再引用它了?因此可以正确释放资源?

1 个答案:

答案 0 :(得分:2)

按照书面规定,您不应有任何内存泄漏。

await for循环中断时,它将取消流订阅。它将在下一个counter处退出yield函数(async*函数检查它是否在yield处被取消,如果是,则它充当{{1 }})。

如果要在取消流时进行清理,可以在代码周围添加return。最终块将运行,就像try {} finally {}是正常的yield一样。由return;循环退出调用的cancel操作 在继续之前要等待清理完成(以使await for函数正确返回)。

函数返回时,没有计时器在运行,流订阅被取消,并且没有人挂在任何东西上。