我最近遇到了一個問題,試圖播放使用SendAsync方法的開放的WebSocket,收到一個InvalidOperationException消息「發送操作已經在進行中」檢測「忙」的WebSocket
通過挖源代碼WebSocket的類,繁忙狀態在內部追蹤:
internal ChannelState _sendState;
// Represents the state of a single channel; send and receive have their own states
internal enum ChannelState {
Ready, // this channel is available for transmitting new frames
Busy, // the channel is already busy transmitting frames
Closed // this channel has been closed
}
理想的情況下,如果我要廣播的更新到WebSocket連接,我想提前知道它是忙碌,執行一些其他處理(例如排隊消息)。
這似乎很奇怪,這種狀態被標記爲內部的 - 是它的公共屬性,我可以簡單地檢查
context.WebSocket.SendState == ChannelState.Ready
什麼是正確的模式SendAsync上的WebSocket會阻止拋出這個異常?
我不願意通過反射破解對該屬性的訪問。
編輯澄清:
的WebSocket.State屬性不會幫助這個情況。該屬性使用此枚舉:
public enum WebSocketState
{
None,
Connecting,
Open,
CloseSent,
CloseReceived,
Closed,
Aborted
}
一旦套接字連接已經打開,該語句將評估爲「真」,無論它是否是忙於發送:
context.WebSocket.State == WebSocketState.Open
你使用的是'AspNetWebSocket'嗎?如果是這樣,它有一個'國家'屬性你可以檢查。 https://msdn.microsoft.com/en-us/library/system.web.websockets.aspnetwebsocket.state(v=vs.110).aspx – dharms
不幸的是,當套接字爲「忙」時,狀態屬性不會改變 - 它仍然是「開放」。嘗試在忙時啓動「SendAsync」會引發異常。 –
也許修改您的代碼只有一個線程正在執行發送操作。該進程可以針對您的應用程序在發送消息時填充的隊列。 – dharms