NETCore.App WebSockets CancellationToken

时间:2016-12-29 15:51:20

标签: c# websocket asp.net-core .net-core

我正在编写一个使用 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 。我可以忍受......但我仍然想知道时差。我保持这个问题的开放性,希望有人可以说出来。

1 个答案:

答案 0 :(得分:1)

Fwiw,我最终使用下面的内容来“处理”这个:

var task = socket.ReceiveAsync(buffer, _cts.Token);

while (!task.IsCompleted && !_cts.IsCancellationRequested)
{
    await Task.Delay(100).ConfigureAwait(false);
}