计算和网络请求波动

时间:2020-01-04 17:34:02

标签: multithreading flutter networking dart dart-isolates

我正在构建一个具有自己的高级协议的应用程序,该协议可以在TCP上运行, 因此,我正在使用RawSocketRawServerSocket来处理TCP通信。 我有一个静态类来处理通信以及应该首先响应的消息的逻辑(使用各种消息队列来处理)。 在flutter是单线程的情况下,为了不挂起主UI,我创建了一个Peridic Timer,它每隔2.5秒检查一次消息队列中是否有新消息(由于套接字的事件侦听器,消息进入队列) ),然后处理消息,并且用户界面似乎运行流畅。

我有一种感觉,如果我要发送大量数据(例如图像或歌曲),由于要从套接字读取事件循环器,我会挂断它。 因此,我尝试创建一个callback function来处理读/写事件,并使用compute方法对其进行调用,以使其能够在自己的Isolate上运行,并在完成后将数据返回给我

Uint8List readFromTcpSocketCallback(Map<String, dynamic> m){
  return (m[ConstantValues.tcpSocketDefinitionForMap.toString()] as RawSocket).read(m[ConstantValues.amountReadDefinitionForMap.toString()]);
}

class Communications{
...
static Future<Uint8List> _readAllFromTcpSocket(RawSocket socket, int length)async{
    Uint8List finalBufferReceived;
    Uint8List buffer;
    int amountRead = 0;
    do
    {
      buffer = await compute(readFromTcpSocketCallback, {ConstantValues.tcpSocketDefinitionForMap.toString() : socket, 
      ConstantValues.amountReadDefinitionForMap.toString() : length - amountRead});
      amountRead += buffer.length;
      finalBufferReceived.isEmpty ? finalBufferReceived = buffer : finalBufferReceived.addAll(buffer);
    }
    while(amountRead < length);
    return finalBufferReceived;
  }
}

很不幸,我遇到了exceptionflutter Illegal argument in isolate message object extends Native Wrapper...

这显然是由于我试图按原样发送RawSocket导致的,如果我能够将其编码为json字符串或它的某种二进制表示形式,然后在回调函数中对其进行解码这会行得通,但我似乎没有找到建立它的实际方法。

我的问题是: 如何在使用socket的同时将callback function发送到compute? 并且,套接字的Read/Write操作是由其自己的Isolate 管理的吗?因为如果是,那么我真的不需要使用compute完全没有 除了颤抖着说compute只能发送primative types之外,我无法找到有关此信息。 创建Isolate并在其send / recv方法中应用复杂的逻辑似乎过于简单,无法建立这样的简单事物。 我真的不明白Flutter团队如何期望我们创建可以在一个线程上平稳运行的应用程序(是的,它们支持异步操作,但是仍然在一个线程上进行管理,这使得大型网络操作确实很痛苦,是如果RawSocket读/写操作未在其他隔离上运行

0 个答案:

没有答案