dart - 当没有更多引用时,async *流会自动关闭吗?

标签 dart

考虑以下程序:

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/

相关文章:

flutter - Flutter:小部件在动画之间切换

flutter - 在 FutureBuilder 中访问多个 future 的结果

flutter - 弧形容器,Flutter顶部带有圆形按钮

flutter - 在 Flutter 中设置 ToggleButtons 之间的间隙

flutter - 如何在按钮的右上角显示可点击的图标?

dart - btw `BehaviorSubject` 和 `Sink` 有什么关系吗?和 `StreamController` ?

notifications - Flutter:如何仅当我们使用 local_notification 单击通知时才执行操作?

list - Dart/flutter : Method 'foldIndexed' isn't defined for the type 'List'

Flutter 错误 - 对 null 值使用 Null 检查运算符(PDF 查看器)

dart - 发布到子目录?