我想在 C# 中开发一个满足以下要求的网络库:
- 对两个方向的多个请求使用相同的连接
- 提供一个简单的包装方法,如
response = Connection.Send(message);
- 支持 SSL(这就是我不使用 SocketAsyncEventArgs 的原因)。
基本上我有两个线程:
- 第一个线程(同步)侦听传入消息并分派所有内容
- 第二个线程负责请求处理
所以基本上代码如下(非常缩短):
BlockingCollection _receivingQueue;
ConcurrentDictionary <MessageID, ResponseHandlerDelegate> _responseHandlers;
Dictionary <MessageID, Message> _responses;
void ListeningThread()
{
while(true)
{
Message = ReadNetworkStream();
_receivingQueue.Add(Message);
}
}
void ProcessingThread()
{
if(Message == Request)
Dispatch(message);
if(Message == ResponseForARequest)
{
_responses.Add(Message.ID, Message);
_responseHandlers[Message.ID](Message);
}
}
这似乎工作得很好。
然而,由于这是一个“易于使用”的库,我想开发上述功能:Response = Connection.Send(Message)
基本上我认为我可以使用 ManuelResetEvent 来执行此操作,以便在收到新响应时进行通知:
Dictionary <Guid, ManualResetEvents> _resetters;
Message Send(Message)
{
ManualResetEvent mre = new ManuelResetEvent(false);
_resetters.Add(Message.ID, mre);
Connection.Send(Message);
WaitFor(mre);
return _responses[Message.ID];
}
MRE 是从注册的 ResponseHandlerDelegate 中设置的
ResponseArrived(Message)
{
_responses.Add(Message.ID, Message);
_resetters[Message.ID].Set();
}
只要没有并发的双向通信,这就会起作用。由于两者 - 服务器和客户端 - 使用相同的代码,它们都在等待设置 MRE...
请注意,上面的所有内容都是某种伪代码,因为真正的类太长了。如果您需要特定的代码部分,请告诉我。
那么我的问题是什么?
我认为我制作的东西是一团糟。有没有简单的方法来解决这个问题?或者有人可以提供一个想法,我可以如何以不同的方式实现这一点?
我不想使用 WCF 来更好地控制较低层,并且 - 主要是因为我想自己开发它 :-)
谢谢