1

我正在学习Isolate's。我阅读了文档。并想编写最小的工作示例。这是我的代码:

main() async
 {

  ReceivePort receivePort = ReceivePort();
  Isolate.spawn(echo, receivePort.sendPort);

  var sendPort = await receivePort.first;

 }


 echo(SendPort sendPort)
 {
   ReceivePort receivePort = ReceivePort();
   sendPort.send(receivePort);
 }

几乎没问题,但我不明白如何发回简单的“Hello”消息。我看了几个例子,有一些中间件,比如sendReceive(). 我正确理解之后:

var sendPort = await receivePort.first;

sendPort将存储生成函数的名称/地址,我需要sendPort.send("hello");吗?

4

1 回答 1

0

您已经说明了如何使用SendPort.send. 事实上,您只能发送原始数据类型,即null, num, bool, double, String如文档中所述。
我将在下面完成您的示例。

import 'dart:isolate';

main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn(echo, receivePort.sendPort);

  final Stream receivePortStream = receivePort.asBroadcastStream();

  receivePortStream.listen((message) {
    if (message is String) {
      print('Message from listener: $message');
    } else if (message is num) {
      print('Computation result: $message');
    }
  });

  final firstMessage = await receivePortStream.first;
  print(firstMessage);
}

echo(SendPort sendPort) {
  sendPort.send('hello');

  sendPort.send('another one');

  final computationResult = 27 * 939;
  sendPort.send(computationResult);
}

请注意,您只想发送'hello'而不是其他一些ReceivePort,因为它不是原始值,所以它甚至不起作用。
在我的示例中,我还设置了另一个侦听器来处理更多消息。

此外,我需要将receivePortStream变量创建为广播流,以便能够收听获得第一条消息。如果你尝试在相同的ReceivePort.listen和上运行,你会得到一个异常。ReceivePort.firstReceivePort

于 2019-07-11T14:58:40.317 回答