使用System.Net.WebSockets.WebSocket
我在一個線程中有一個讀循環。關閉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.'
我試圖傳遞一個CancellationToken
到ws.ReceiveAsync
,這樣我可以從接收循環中調用ws.CloseAsync
。這並沒有中斷ReceiveAsync
呼叫,它在下一條消息到達時返回。
是否可以乾淨地關閉讀取循環外的套接字。 我可以實現「關閉連接」消息,但在WebSocket協議中存在發送關閉消息的概念時似乎過度消耗。
你確定* CancellationToken不會取消ReceiveAsync嗎?這似乎很奇怪。 –
@StephenCleary至少不會在下一條消息到達之前5-10秒之後 – hultqvist
在這種情況下,您需要調用CloseOutputAsync並在讀取中處理CloseSent消息類型。 –