为什么Dart隔离中的流在没有接收端口的情况下不起作用

问题描述 投票:1回答:1

当我尝试在隔离区中使用流时,我遇到了一个奇怪的问题,如果我尝试这样的事情

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

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

dart stream stdin dart-isolates
1个回答
1
投票

您的第一个示例中的问题是,您没有等待在主线程/隔离中完成隔离。当主线程/隔离没有任何事情要做并且事件队列为空时,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;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.