を使用するSystem.Net.WebSockets.WebSocket
私は1つのスレッドで読み取りループを持っています。WebSocket Threadsafeを閉じる
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
他のスレッドから書きます。
lock (ws)
ws.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None).Wait();
これは問題なく動作します。
私の質問は、この接続をきれいに閉じることができますか?例外結果を閉じる
任意の試み:
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Bye", CancellationToken.None);
InvalidOperationException: 'Concurrent reads are not supported.'
は、私は受信ループ内からws.CloseAsync
を呼び出すことができるようにws.ReceiveAsync
にCancellationToken
を通過しようとしました。それはReceiveAsync
コールを中断せず、次のメッセージが到着したときに戻った。
読み取りループ外のソケットをきれいに閉じることは可能ですか? WebSocketプロトコルでクローズメッセージを送信するというコンセプトがある場合は、「接続を閉じる」というメッセージを実装できますが、それは過剰なようです。
'CancellationToken'は' ReceiveAsync'をキャンセルしませんか?それは非常に奇妙なようです。 –
@StephenCleary少なくとも次のメッセージが届くまでに5〜10秒後に届きます – hultqvist
その場合は、 'CloseOutputAsync'を呼び出し、' CloseSent'メッセージタイプを読み込みで処理する必要があります。 –