【问题标题】:NETCore.App WebSockets CancellationTokenNETCore.App WebSockets CancellationToken
【发布时间】: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


【解决方案1】:

Fwiw,我最终使用类似下面的东西来“处理”这个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 2023-03-31
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2021-02-18
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多