Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何避免阻塞等待来自websocket的响应_Multithreading_Asynchronous_Websocket_Request_Response - Fatal编程技术网

Multithreading 如何避免阻塞等待来自websocket的响应

Multithreading 如何避免阻塞等待来自websocket的响应,multithreading,asynchronous,websocket,request,response,Multithreading,Asynchronous,Websocket,Request,Response,鉴于以下情况: interface IHasName { string GetName(); } class Me: IHasName { private WebsocketClient _ws; string GetName() { return _ws.GetName(); } } class WebsocketClient { Map<string,RootObject> _recvMessages; Map<

鉴于以下情况:

interface IHasName
{
  string GetName();
}

class Me: IHasName
{
   private WebsocketClient _ws;

   string GetName()
   {
        return _ws.GetName();
   }
}

class WebsocketClient
{

   Map<string,RootObject> _recvMessages;
   Map<string,signal> _signals;

   //Fired when the websocket receives a messsage
   private void OnMessage(OnMessageEventArgs e)
   {
        //Deserialize data to RootObject call this obj
        //Assume we got whole message
        _recvMessages[obj.token] = obj;
        _signals[obj.token].Notify();            
   }

   public string GetName()
   {
       RootObject obj = new RootObject();
       obj.token = // Some unique token;

       _signals[obj.token] = //a synchronization signal

       Send(Serialize(obj).ToString)); //Sends the websocket message
       _signals[obj.token].wait();

        return  _recvMessages[obj.token].Name;           
   }

}


class RootObject
{
    string token;
    string Name;
}
接口IHasName
{
字符串GetName();
}
类名称:IHasName
{
私有WebsocketClient;
字符串GetName()
{
返回_ws.GetName();
}
}
类WebsocketClient
{
地图记录信息;
地图信号;
//当websocket收到消息时激发
私有消息无效(OnMessageEventArgs e)
{
//将数据反序列化为根对象调用此obj
//假设我们得到了全部信息
_recvMessages[obj.token]=obj;
_信号[obj.token].Notify();
}
公共字符串GetName()
{
RootObject obj=新的RootObject();
obj.token=//某个唯一的令牌;
_信号[obj.token]=//同步信号
Send(Serialize(obj.ToString));//发送websocket消息
_信号[obj.token].wait();
返回_recvMessages[obj.token].Name;
}
}
类根对象
{
字符串标记;
字符串名;
}
所以,我将ioobject公开给我的UI。我显然不想阻止UI,但这个实现肯定会阻止。我可以让UI负责管理它自己的异步行为(我倾向于这样),我担心的是,在收到websocket的响应时使用线程等待信号看起来是浪费

我应该在WebsockerClient中引入回调机制,但如何在不向IOObject接口公开回调机制的情况下实现这一点呢。我试图使API保持简单,这样使用IOObject的人就不必担心后端是否是websocket后端,它将受益于基于事件的系统或内存中可以立即返回数据的某些数据存储。有人建议只创建一个线程来轮询websocket以获取数据,并将其存储在数据存储中,我觉得在系统中可能会有不止几个“Me”对象的实例化,而让Me对象负责生成一个线程并轮询不同的websocket并没有什么好处。建议