初めに。ソケットプログラミングに関して言えば、ロックはすべて悪いことです。@AndrewKeithのソリューションは、コマンドのキューイングと送信に非常に適しています。
必要なのは、別のキューに入れて応答とともに送り返すことができる要求 ID を持っていることです。そうすることで、いくつかの進行中のコマンドを持つことができます。
簡単な擬似コード:
public void Send(ICommand command)
{
var myPacket = new CommandPacket {
Command = command,
RequestId = Guid.NewGuid()
};
_pendingCommands.Add(myPacket);
var buffer = Serialize(myPacket);
socket.Send(buffer);
}
public void OnReceive(IAsynResult ar)
{
var bytesRead = socket.EndRecieve(ar);
_inStream.Write(_readBuffer, 0, bytesRead);
if (GotCompletedPacket(_inStream))
{
var packet = Deserialize(_inStream);
var waitingCommand = _pendingCommands.FirstOrDefault(p => p.RequestId == packet.RequestId);
if (waitingCommand != null)
//got a reply to the command.
}
}
コマンドを呼び出すときに、個人的にデリゲートを追加します。
public void Send(ICommand command, ICommandHandler handler)
応答が受信されたときにそのハンドラーを呼び出します。