立即取消 .Net WebSocket SendAsync

Cancel a .Net WebSocket SendAsync Immediately

我正在使用 websocket 向 1000 个客户端发送消息。如果消息未在 100 毫秒内发送出去,我想取消 websocket.SendAsync。我的代码如下。

var cancelTaskToken = transport.GetTaskCancelToken();
        cancelTaskToken.CancelAfter(100);
        var webSocket = transport.GetWebSocket().WebSocket;



        var webSocketContext = new WebSocketSendContext(webSocket, message.Value, transport, Counters, _trace);
        var context = (WebSocketSendContext)webSocketContext;
        try
        {
            if (context.socket.State != System.Net.WebSockets.WebSocketState.Open) return;
            await context.socket.SendAsync(context.payload, System.Net.WebSockets.WebSocketMessageType.Binary, true, cancelTaskToken.Token);
            context.transport.MarkHeatBeat();
            context.counters.MessagesSentToClientTotal.Increment();
            context.counters.MessagesSentToClientPerSec.Increment();

        }
        catch (OperationCanceledException ex)
        {
            context.trace.Error(ex, "cancel socket sending on {connectionId}. websocket state: {webSocketState}", transport.ConnectionId, webSocket.State);
            context.counters.ErrorsTransportPerSec.Increment();
            context.counters.ErrorsTransportTotal.Increment();
            context.counters.ErrorsAllPerSec.Increment();
            context.counters.ErrorsAllTotal.Increment();
        }

但在我的测试中,sendAsync 总是在 1000 毫秒后取消。我不知道为什么 websocket 不接受我的 100ms 设置?

我使用 serilog/seq 来跟踪我的应用程序。这是跟踪图像

@SeanOB,你是对的。日志中的 1 秒间隔是内部的 serilog 日志记录。它并没有取消我的 CancelToken 中的超时设置。

我现在可以确认取消确实发生在 100 毫秒后。