1

当前 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 实例)”

Map 的两个键是字符串,值包括一个SendPort和另一个字符串。简单,没什么花哨的,并且应该可以作为消息发送以产生隔离(直到几天前工作得很好)。

问题:是什么改变了我现在做错了什么?什么是潜在的解决方法?

任何帮助将不胜感激。

4

1 回答 1

0

对于我来说,使用来自 2.0.0-dev.69.0 标签的新构建的 VM 不会重现此问题(--version 为:Dart VM 版本:2.0.0-dev.69.0(2018 年 7 月 17 日星期二 14:57:16 +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);
}

它运行并打印预期的行。隔离请求确实看起来应该是可序列化的(带有字符串键和值的映射,字符串或 a SendPort),在您未显示的代码中必须进行其他操作。

你能从你的代码中提取一个仍然表现出这种行为的可运行程序,或者说更多关于代码周围发生的事情吗?

于 2018-07-19T08:00:16.843 回答