我正在编写一个使用 System.Net.WebSockets.WebSocket 接收客户端数据的服务器。
var data = await webSocket.ReceiveAsync(requestBuffer, httpContext.RequestAborted);
如果客户端在未关闭连接的情况下断开连接(例如,如果客户端崩溃),服务器应该能够取消 ReceiveAsync任务。 出于这个原因,我使用了 Microsoft.AspNetCore.Http.HttpContext 的RequestAborted CancellationToken。但它不起作用。
我不确定是否必须实现具有超时的CancellationToken。在客户端,我可以实现一个" KeepAlive"在超时间隔内发送的消息。有人可以通过超时向我显示CancellationToken的实现吗?
[更新]
原来我可以使用这个CancellationToken:
CancellationTokenSource source = new CancellationTokenSource(10000);
var request = await session.Socket.ReceiveAsync(requestBuffer, source.Token);
我假设它将在10000毫秒后取消任务并继续执行。相反,它会在120000毫秒后抛出 OperationCanceledException 。我可以忍受......但我仍然想知道时差。我保持这个问题的开放性,希望有人可以说出来。
答案 0 :(得分:1)
Fwiw,我最终使用下面的内容来“处理”这个:
var task = socket.ReceiveAsync(buffer, _cts.Token);
while (!task.IsCompleted && !_cts.IsCancellationRequested)
{
await Task.Delay(100).ConfigureAwait(false);
}