【发布时间】:2017-09-07 06:34:18
【问题描述】:
我正在编写一个使用 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 毫秒后取消 Task 并继续执行。相反,它会在 120000 毫秒后抛出 OperationCanceledException。我可以忍受......但我仍然想知道时差。我一直保持这个问题,希望有人能告诉我一些事情。
【问题讨论】:
-
Token将在 10 秒后自动设置为取消,这很好。但是,实际中止是通过实现ReceiveAsync来执行的,因为它在 120 秒后中止,所以显然不能很好地取消。您对此无能为力。
标签: c# websocket asp.net-core .net-core