gpt4 book ai didi

c# - WebSocket异常关闭不返回ReceiveAsync

转载 作者:行者123 更新时间:2023-11-30 16:42:57 25 4
gpt4 key购买 nike

我在服务器上有一个线程用于处理通过 WebSocket 连接从客户端接收的数据:

    public HttpResponseMessage Get()
{
if (HttpContext.Current.IsWebSocketRequest)
{
HttpContext.Current.AcceptWebSocketRequest(ProcessWebSocket);
}

return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
}

private async Task ProcessWebSocket(AspNetWebSocketContext context)
{
WebSocket webSocket = context.WebSocket; //Gets the current WebSocket object.
const int maxMessageSize = 1024;
byte[] receivedDataBuffer = new byte[maxMessageSize];
logger.Debug("WSC-New WebSocket connection");
while (webSocket.State == WebSocketState.Open)
{
var timeOut = new CancellationTokenSource(70000).Token;
WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(receivedDataBuffer), timeOut);
//If input frame is cancelation frame, send close command.
if (webSocketReceiveResult.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, String.Empty, CancellationToken.None);
logger.Debug("WSC-Close WebSocket connection frame received");
}
else
{
//Process received data....
}
}
logger.Debug("WSC-WebSocket closed, WebSocket state: {0}", webSocket.State.ToString());
}

只要另一端正确关闭 WebSocket 连接,我就会在最后收到记录器消息,指出 websocket 已关闭,这意味着该线程已正确终止。如果客户端进入休眠状态或程序突然停止,则不会发生正常的 WebSocket 关闭。在这种情况下,webSocket.ReceiveAsync 永远不会返回。我担心如果启动了足够多的这些线程但从未终止,我可能会发生严重的内存泄漏。超时取消 token 应该在 70 秒后返回,但它并没有发生。如果我在这种情况下尝试从另一个线程访问 webSocket 对象,则会出现以下异常:无法访问已处置的对象。

如何从 await webSocket.ReceiveAsync(new ArraySegment(receivedDataBuffer), timeOut); 返回正确关闭此线程?

最佳答案

问题:

几乎任何连接的突然关闭都会导致另一个套接字再也无法获取数据,这会导致您的套接字像您所说的那样保持打开状态。

解决方案:

尝试使用 Keep-Alive 来确定连接何时超时,另一种解决方案是使用一个单独的线程,该线程可能会被杀死以丢弃它,但是我不确定这对您来说效果如何。

启动套接字EX:

Thread X = new Thread(() => {
Connect();
});
X.Start();

结束套接字EX:

X.Abort();
// You could also force a Garbage Collection using
GC.Collect();

关于c# - WebSocket异常关闭不返回ReceiveAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com