代码之家  ›  专栏  ›  技术社区  ›  Benny

异步套接字通信阻塞

  •  0
  • Benny  · 技术社区  · 14 年前

    我有一个SocketWrapper类,它用服务器发送和接收消息(特别是命令、响应和通知)。我还有一个消费类,它将命令序列化为文本以通过包装器发送。我的问题是,当一个命令被发送时,我需要等待,直到我得到一个带有特定头的消息。当我这样做时,消费类会锁定我正在使用的ManualReseteEvent.WaitOne,它是由我的接收方法设置的。使用类锁时出现问题的原因是在此期间可能会收到另一条消息,而我无法处理它。是否有任何方法可以锁定特定对象,以便我的类仍能响应其他事件?

    发送方法:

        _waitingCommands.Enqueue(command);
        String commandText = command.ToString();
        _socket.Send(commandText);
    

    接收方法:

    if (response.Header.Type == Messages.MessageType.Response)
    {
       if (command.Response == null)
          command.Response = response;
    
       _waitingCommands.Dequeue();
       command.Finished.Set();
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   George Johnston    14 年前

    使用socket.beginsend和socket.beginreceive。这些将分离线程,使您的主线程可以继续处理。一旦发送或接收到数据,连接到BeginSend/BeginReceive方法的方法将按逻辑顺序启动。

    Begin Send

    BeginReceive