在邮件中包含SendPort时,Isolate.spawnUri当前导致错误?

时间:2018-07-18 15:49:26

标签: dart dart-isolates

当前Dart环境:
Dart VM版本:“ linux_x64”上的2.0.0-dev.69.0(未知时间戳记)

我正在尝试通过 Isolate 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 个答案:

答案 0 :(得分:0)

对于我来说,这不是使用2.0.0-dev.69.0标记(-版本是:Dart VM版本:2.0.0-dev.69.0(从7月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的值的映射), else 必须在不属于您的代码中进行显示。

您可以从仍然表现出这种行为的代码中提取一个可运行的程序,还是说一些有关代码周围发生的事情?