如何避免阻止等待来自websocket

时间:2017-03-17 22:21:34

标签: 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<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;
}

所以,我将IObject暴露给我的UI。我显然不想阻止UI,但这个实现肯定会阻止。我可以让UI负责管理它自己的异步行为(我倾向于),我担心的是使用线程在收到来自websocket的响应时等待信号看起来像是浪费。

我是否应该在WebsockerClient中引入回调机制,但是如何在不将该回调机制暴露给IObject接口的情况下执行此操作。我试图保持API简单,以便那些使用IObject的人不需要担心,如果后端是一个websocket后端,它将受益于基于事件的系统或只是内存中可以立即返回数据的一些数据存储。有人提出的建议就是创建一个线程来轮询websocket以获取数据并实际将其存储在数据存储区中,我觉得虽然在系统中可能存在多个“Me”对象的实例化,并且赋予Me对象责任以产生一个线程并轮询不同的websockets,因此不会。建议?

0 个答案:

没有答案