我在服务器上开设了一个线程,用于处理通过WebSocket连接从客户端接收到的数据:
只要另一端正确关闭WebSocket连接,我就会在最后收到记录器信息,表明这个线程正确终止。如果客户端进入休眠状态或程序突然停止,则不会发生正常的WebSocket关闭。在这种情况下,webSocket.ReceiveAsync永远不会返回。我担心如果启动了足够多的这些线程却没有终止,可能会出现严重的内存泄漏问题。超时取消令牌应该在70秒后使其返回,但实际上并未发生。如果我尝试在此情况下从另一个线程访问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.ReceiveAsync永远不会返回。我担心如果启动了足够多的这些线程却没有终止,可能会出现严重的内存泄漏问题。超时取消令牌应该在70秒后使其返回,但实际上并未发生。如果我尝试在此情况下从另一个线程访问webSocket对象,则会出现以下异常:无法访问已处理的对象。
我该如何从await webSocket.ReceiveAsync(new ArraySegment(receivedDataBuffer), timeOut); 返回到正确关闭此线程?