非同期/待機APIを提供したいTCP上で実行される要求/応答プロトコルがあります。プロトコルはSTOMPです。これは、TCPまたはSSL上で実行される非常に単純なテキストベースのプロトコルです。STOMPでは、クライアントは6つほどのコマンドフレームの1つを送信receipt
し、コマンドのヘッダーでIDを指定します。サーバーは、RECEIPT
またはERROR
フレームのいずれかでreceipt-id
フィールドを使用して応答するため、クライアントは応答を元の要求と照合できます。サーバーは、MESSAGE
を含まないフレームをいつでも送信できます(STOMPは基本的にメッセージングプロトコルです)receipt-id
。
複数の未処理の要求を許可し、任意のMESSAGE
フレームを処理するために、計画では常にSocket.BeginReceive()
未処理があります。したがって、私が考えていた最も簡単な実装は、待機可能なイベント(ミューテックスなど)を作成し、そのイベントをテーブルに格納receipt
し、インデックスに設定されたコマンドリクエストをテーブルに送信し、イベントをブロックすることです。起動するsocket.BeginReceive()
と、関数はreceipt-id
メッセージからを取得し、テーブルでイベントを検索し、それを通知します(そして、成功やエラーなどの状態を保存します)。これにより、呼び出し元の関数がウェイクアップし、結果を確認して、呼び出し元のアプリケーションに成功または失敗を返すことができます。
これは根本的に正しいように聞こえますか?私は以前にasync/await APIを使用したことがありますが、自分でAPIを作成したことはありません。よろしければ、どのような待機可能なイベントを使用すればよいですか?単純なMonitor.Wait()
ブロックはブロックされますが、私が望む方法ではありません、正しいですか?全部を包むと、Task.Run()
それは正しく動作しMonitor.Wait()
ますか?または、代わりに使用する必要がある新しい同期構造はありますか?私は基本的に実装HttpClient.GetAsync()
していますが、それが内部でどのように機能するか知っている人はいますか?