次の要件を満たすネットワーク ライブラリを c# で開発したいと考えています。
- 双方向の複数のリクエストに同じ接続を使用する
- 次のような簡単なラッパーメソッドを提供します
response = Connection.Send(message);
- SSL をサポートします (これが、SocketAsyncEventArgs を使用しない理由です)。
基本的に私は2つのスレッドを持っています:
- 最初のスレッドは受信メッセージを (同期的に) リッスンし、すべてをディスパッチします
- 2 番目のスレッドは要求処理を担当します
したがって、基本的にコードは次のようになります (非常に短縮されます)。
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 を使用したくありません。下位レイヤーをより適切に制御するためです。主に、自分で開発したいからです :-)
ありがとう