为什么Dart隔离中的流在没有接收端口的情况下无法工作

约瑟夫·阿特夫

当我尝试在隔离中使用流时,如果遇到类似问题,我会遇到一个奇怪的问题

main() async {
  await Isolate.spawn(entryPoint, null);
}

entryPoint(SendPort sendPort) {
  getStreamOfNumbers().listen((data) => print('data : $data'));
}

Stream<int> getStreamOfNumbers() async* {
  for (int x = 0; x < 10; x++) yield x;
}

没有任何内容打印到控制台中,但是如果我在main方法内添加了接收端口,即使我不使用接收端口,它也能正常工作

 main() async {
  ReceivePort receivePort = ReceivePort();
  await Isolate.spawn(entryPoint, null);
}

//the output is : 
//data : 0
//data : 1
//data : 2
//data : 3
//data : 4
//data : 5
//data : 6
//data : 7
//data : 8
//data : 9

这是错误还是我有什么问题?

julemand101

第一个示例中的问题是您不等待主线程/隔离中的隔离完成。当主线程/隔离无所事事且事件队列为空时,Dart退出。

在您的下一个示例中,它“有效”,但您没有告诉您的是程序永不退出。那是因为您创建了一个没有侦听器的ReceivePort,它阻止了主线程/隔离停止,因为它现在永远等待。

如果改为以这种方式使用ReceivePort,则可以使用它来等待隔离完成,并且仅在发生这种情况时退出主循环:

import 'dart:isolate';

Future<void> main() async {
  final rPort = ReceivePort();
  await Isolate.spawn(entryPoint, null, onExit: rPort.sendPort);
  await rPort.first;
}

void entryPoint(SendPort sendPort) {
  getStreamOfNumbers().listen((data) => print('data : $data'));
}

Stream<int> getStreamOfNumbers() async* {
  for (var x = 0; x < 10; x++) {
    yield x;
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在没有类型应用程序的情况下某些函数调用无法工作?

为什么在Perl中没有引号的情况下无法解析数字

为什么在不覆盖 Dart 中的所有字段的情况下实现类时没有错误?

为什么我的代码在没有chroot函数的情况下可以工作,而在chroot函数中却失败了?

为什么此代码在没有volatile的情况下可以正常工作?

为什么在没有分配正确的字节数的情况下malloc可以工作?

在没有活动的情况下启动应用程序,我的广播接收器无法正常工作

为什么在没有密码的情况下无法登录我的加密帐户?

Gradle可以在没有main()的情况下执行TornadoFX应用,而IntelliJ无法...为什么?

为什么Firefox无法在没有错误消息的情况下启动Css?

为什么在没有推送git的情况下提交?

为什么函数在没有参数的情况下运行?

为什么Google Maps API组件在没有* NgIf的情况下可以工作,而在排除* NgIf的情况下却可以工作?角度9

在没有情节提要的情况下隔离视图

为什么不能在没有枚举的情况下从HashSet中检索项目?

为什么在c ++中可以在没有#include线程的情况下使用std :: thread?

为什么在Sparks等效的情况下pyspark中的数据框没有映射功能?

为什么R中的`if语句'在没有逻辑条件的情况下被评估?

为什么在我的“ pom.xml”中没有任何插件配置的情况下,Maven命令“ mvn sonar:sonar”可以工作?

如果在没有CSS的情况下仍然可以正常工作,为什么还要在CSS中添加-webkit-前缀?

为什么最小高度和百分比在没有容器高度的情况下可以工作?

Android 4.4.2在没有enableReaderMode的情况下无法接收SELECT容器

Ruby在没有显式接收器的情况下,什么类会获得方法?

为什么在没有标题的情况下无法识别新的关键字/运算符/函数?

为什么Docker容器在Ubuntu 12.04上没有启动脚本的情况下无法在启动时启动?

为什么Z3在没有看似微不足道的修改的情况下无法解决这个问题?

为什么在没有引用运算符的情况下编译器无法决定要调用哪个函数?

为什么没有完整名称空间的情况下无法从字符串实例化新对象

在没有端口的情况下访问freenode