Как получить простой ответ от изолята?

Я узнаю о Isolate. Я читаю документы. И хочу написать минимальный рабочий пример. Вот мой код:

main() async
 {

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

  var sendPort = await receivePort.first;

 }


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

Это почти нормально, но я не могу понять, как я могу отправить простое сообщение «Привет». Я посмотрел несколько примеров, и там было какое-то промежуточное ПО, такое как sendReceive(). Я правильно понимаю, что после:

var sendPort = await receivePort.first;

sendPort будет хранить имя/адрес порожденной функции, а мне нужно sendPort.send("hello");?


person Dmitry Bubnenkov    schedule 11.07.2019    source источник


Ответы (1)


Вы уже говорили, как отправлять простые данные, используя 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.first на одном и том же ReceivePort, вы получите исключение.

person creativecreatorormaybenot    schedule 11.07.2019