我最近遇到了一个问题,尝试使用 SendAsync 方法广播到打开的 WebSocket,收到 InvalidOperationException 消息“发送操作已经在进行中”
挖掘 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
WebSocket 上的 SendAsync 的正确模式是什么,可以防止引发此异常?
我不愿意通过反射来破解对该属性的访问。
编辑以澄清:
WebSocket.State 属性无助于这种情况。该属性使用此枚举:
public enum WebSocketState
{
None,
Connecting,
Open,
CloseSent,
CloseReceived,
Closed,
Aborted
}
一旦打开套接字连接,无论它是否忙于发送,此语句都将评估为“true”:
context.WebSocket.State == WebSocketState.Open