Ответ из изолята в Dart
Чтобы второй изолят прислал результат, основной
сначала получает его SendPort, затем
передает свой порт для ответа вместе с заданием.
Удобно упаковать пару в список: сначала
SendPort для ответа, затем строка.
Дочерняя функция читает список, берет порт и шлет на него число - например длину строки:
import 'dart:isolate';
void main() async {
var receive = ReceivePort();
await Isolate.spawn(count, receive.sendPort);
var workerSend = await receive.first as SendPort;
var replyPort = ReceivePort();
workerSend.send([replyPort.sendPort, "note"]);
var answer = await replyPort.first;
print(answer);
replyPort.close();
receive.close();
}
void count(SendPort mainSend) {
var inbox = ReceivePort();
mainSend.send(inbox.sendPort);
inbox.listen((message) {
if (message is List) {
var reply = message[0] as SendPort;
var text = message[1] as String;
reply.send(text.length);
}
});
}
Ответом может быть int или снова строка.
Свой класс без подготовки к передаче лучше
не использовать - проще список или примитив.
Основной изолят ждет число на отдельном
ReceivePort и не блокирует прием
общего канала.
Передайте во второй изолят список из порта
и строки "run". Верните число символов
в строке и выведите его в main.
Дан следующий код:
import 'dart:isolate';
void main() async {
var receive = ReceivePort();
await Isolate.spawn(sumCode, receive.sendPort);
}
void sumCode(SendPort mainSend) {
var inbox = ReceivePort();
mainSend.send(inbox.sendPort);
inbox.listen((message) {
if (message is List) {
var reply = message[0] as SendPort;
var text = message[1] as String;
}
});
}
Допишите main и тело обработчика:
отправьте строку "ab", посчитайте сумму
кодов символов codeUnitAt и верните
int. Выведите ответ.