繁体   English   中英

在 Dart 中,为什么要等待一个微不足道的(“空”)流控制器 stream 立即退出程序?

[英]In Dart, why waiting for a trivial (“empty”) StreamController stream immediately exits program?

这是一个简单程序的主干,它使用 StreamController 监听一些输入 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 并在其自己的 stream 上输出一些其他数据作为反应:

import 'dart:async';     

main() async {     
    var c = StreamController(         
            onListen: (){},         
            onPause: (){},         
            onResume: (){},         
            onCancel: (){});         

    print("start");         
    await for (var data in c.stream) {         
            print("loop");         
    }         

    print("after loop");         
}     

Output:

$ dart cont.dart
start
$ dart

为什么这段代码在没有执行 print("loop") 和 print("after loop") 的情况下立即退出 await for 行?

注意:在原始程序中,onListen() 将接收输入 stream 并订阅它。 该循环实际上一直有效,直到在输入 stream 上调用 subscription.cancel() 时,它也突然退出,没有任何清理的机会。

我对此感到惊讶,但是所有的async/await代码又被转换为.then() s,似乎一切都无法完美翻译。

似乎这是答案的一部分:您需要在另一个任务中关闭 stream 才能摆脱await for . 是以前的相关问题。 由于我们不关闭它, await for后的行不会执行。 这是一个避免这种情况的示例:

import 'dart:async';

main() async {
  var c = StreamController(
      onListen: () {},
      onPause: () {},
      onResume: () {},
      onCancel: () {});

  print("start");
  await Future.wait(<Future>[producer(c), consumer(c)]);

  print("after loop");
}

Future producer(StreamController c) async {
  // this makes it print "loop" as well
  // c.add("val!"); 
  await c.close();
}

Future consumer(StreamController c) async {
  await for (var data in c.stream) {
    print("loop");
  }
}

打印:

start
after loop

所以,这个故事的寓意是,

  1. 永远不要让 StreamController 无人看管,否则会发生奇怪的事情。
  2. 你等待的一些异步函数会破坏你的代码,甚至绕过你的 try/finally 块!

我以为我对 async/await 了如指掌,但第二点现在让我害怕了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM