Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C#异步套接字通信阻塞_C#_Sockets - Fatal编程技术网

C#异步套接字通信阻塞

C#异步套接字通信阻塞,c#,sockets,C#,Sockets,我有一个套接字包装类,它通过服务器发送和接收消息(特别是命令、响应和通知)。我还有一个消费类,它将命令序列化为文本,通过包装器发送。我的问题是,当一个命令被发送时,我需要等待,直到我收到一个带有特定头的消息。当我执行此操作时,消费类在我使用接收方法设置的ManualResetEvent.WaitOne时锁定。当我的消费类锁定时出现问题的原因是,在此期间可能会收到另一条消息,而我无法处理它。是否有任何方法可以锁定特定对象,以便我的类仍然可以响应其他事件 发送方法: _waitingComm

我有一个套接字包装类,它通过服务器发送和接收消息(特别是命令、响应和通知)。我还有一个消费类,它将命令序列化为文本,通过包装器发送。我的问题是,当一个命令被发送时,我需要等待,直到我收到一个带有特定头的消息。当我执行此操作时,消费类在我使用接收方法设置的ManualResetEvent.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();
}

使用socket.BeginSend和socket.BeginReceive。这些将分离出单独的线程,允许主线程继续处理。发送或接收数据后,连接到BeginSend/BeginReceive方法的方法将按逻辑顺序启动