2010-01-15 149 views
0

我有一個套接字封裝類,發送和接收消息與服務器(特別是命令,響應和通知)。我還有一個消費類,它將這些命令序列化爲文本以通過包裝器發送。我的問題是,當一個命令被髮送時,我需要等到我收到一個帶有特定標題的消息。當我這樣做時,由於我使用由接收方法設置的ManualResetEvent.WaitOne,因此消耗類會鎖定。當我的消費類鎖定是另一個消息可能在此期間被接收並且我無法處理它時,這是一個問題。有沒有辦法鎖定一個特定的對象,所以我的班級仍然可以響應其他事件?C#異步套接字通信阻塞

發送方法:

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

Receive方法:

if (response.Header.Type == Messages.MessageType.Response) 
{ 
    if (command.Response == null) 
     command.Response = response; 

    _waitingCommands.Dequeue(); 
    command.Finished.Set(); 
} 

回答

0

使用socket.BeginSend和socket.BeginReceive。這些將分離出獨立的線程,這將允許您的主線程繼續處理。數據發送或接收後,您按照邏輯順序觸發連接到BeginSend/BeginReceive方法的方法。

Begin Send

BeginReceive