立即取消 .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 毫秒后。
我正在使用 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 毫秒后。