質問: System.Net.WebSockets.WebSocketMessageType.Close) { // コネクションを閉じるリクエストに応答する await room.Receiver.CloseOutputAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, "正常終了", CancellationToken.None); break; } } } // CastEventData, CastDataはサーバー・クライアント間でやりとりするデータ public class OpenRoom { public string Name { get; set; } public CastData CastData { get; set; } public System.Net.WebSockets.WebSocket Receiver { get; set; } public List Senders { get; set; } internal Task ReceiveAsync(CastEventData message) { message.Event.Apply(CastData); // イベントに応じてサーバー上のデータを書き換える return Task.CompletedTask; } } ``` デバッグ内容 ------- この問題について、ブレークポイントを置いてデバッグしています。クライアント側からコネクションを閉じるリクエストを送ると、サーバー側では「コネクションを閉じるリクエストに応答する」のコメントの部分が実行されました。これによってサーバーからクライアントへの応答もできているつもりなのですが、うまく行かず悩んでいるところです。
回答: 解決しました。 定期的な更新処理の呼び出しが必要な独自の同期コンテキストを使用した状況下で、更新処理なく`Task`を`Wait`したためにデッドロックが発生していたようでした。 今回のプロジェクトはゲームプログラムであり、以下の記事に出てくるようなゲームループを利用した同期コンテキストを用いていました。 コルーチン用途にawaitを使うためのSynchronizationContext この同期コンテキストは定期的に更新処理を呼び出す必要があり、問題のコードで`Wait`メソッドを使用した場所では定期的な更新処理が呼び出されていませんでした。独自の同期コンテキストを正しく更新して使うように変更すると、`CloseAsync`メソッドが正しく完了するようになりました。 今回の問題は、`Wait`メソッドで待機したタスクは同期コンテキストへ投げられないだろうという勘違いが原因でした。 情報の不足した質問により大変失礼いたしました。皆様ご回答ありがとうございました。