Isolate.spawnUri в настоящее время приводит к ошибке при включении SendPort в сообщение?
Текущая среда дартс:
Версия VM Dart: 2.0.0-dev.69.0 (Неизвестная временная метка) на "linux_x64"
Я пытаюсь породить изолят через изолят.spawnUri и включите SendPort в сообщение. Код, который у меня есть, настроен так:
import 'dart:convert' show json;
import 'dart:isolate';
var servicePort = new ReceivePort()
..listen (/stuff to handle response/);
Map isolateRequest = {
'sendPort': servicePort.sendPort, <-- String => SendPort
'info': json.encode (/info to send to spawned isolate/) <-- String => String
};
Isolate.spawnUri (new Uri.file (/isolate main/), [], isolateRequest);
Этот тип настройки используется для работы. Теперь я получаю следующую ошибку:
"Недопустимый аргумент (ы): недопустимый аргумент в изолированном сообщении: (объект является обычным экземпляром Dart)"
Два ключа для карты являются строками, а значения включают SendPort и другую строку. Просто, ничего особенного, и должно быть приемлемо для отправки в качестве сообщения для порождения изолята (прекрасно работало до нескольких дней назад).
Вопросы: что изменилось, что я сейчас что-то делаю не так? Каковы возможные обходные пути?
Любая помощь будет оценена.
1 ответ
Это не воспроизводится для меня со свежесобранной виртуальной машиной из тега 2.0.0-dev.69.0 (--version: версия VM Dart: 2.0.0-dev.69.0 (вт 17 июля 14:57:16 2018 +0200) на "linux_x64").
Используя эту полную программу:
import 'dart:convert' show json;
import 'dart:isolate';
main(args, message) {
if (message != null) {
print("Out, ");
message["sendPort"].send("And home again!");
return;
}
var servicePort = new ReceivePort();
servicePort.forEach((m) {
print(m);
servicePort.close();
});
Map isolateRequest = {
'sendPort': servicePort.sendPort, // <-- String => SendPort
'info': json.encode({}) // <-- String => String
};
Isolate.spawnUri (new Uri(path:"iso.dart"), [], isolateRequest);
}
он работает и печатает ожидаемые строки. Изолированный запрос действительно выглядит как нечто, что должно быть сериализуемым (сопоставление со строковыми ключами и значениями, которые являются либо строками, либо SendPort
), что - то еще должно происходить в коде, который вы не показываете.
Можете ли вы извлечь работающую программу из вашего кода, которая все еще демонстрирует такое поведение, или сказать что-то еще о том, что происходит вокруг кода?