Отмена WebSocket в C#
Ожидание сети прерывают через
CancellationToken. Его передают в
ConnectAsync и ReceiveAsync.
Если токен уже отменён, операция не начнётся
и выбросит
OperationCanceledException -
это штатный способ остановить вызов.
Ниже токен отменяют до подключения к несуществующему локальному порту. Реальное соединение не понадобится: отмена сработает раньше таймаута сети:
using System.Net.WebSockets;
using ClientWebSocket client = new();
using CancellationTokenSource cts = new();
cts.Cancel();
try
{
await client.ConnectAsync(new Uri("ws://127.0.0.1:59999"), cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("canceled");
}
Тот же токен работает на ReceiveAsync: если
отменить ожидание ответа, чтение прервётся, даже
когда соединение уже Open. Ниже токен
отменяют сразу после отправки, и чтение не
дождётся echo:
using System.Net.WebSockets;
using System.Text;
using ClientWebSocket client = new();
using CancellationTokenSource link = new(TimeSpan.FromSeconds(8));
await client.ConnectAsync(new Uri("wss://echo.websocket.events"), link.Token);
await client.SendAsync(Encoding.UTF8.GetBytes("ping"), WebSocketMessageType.Text, true, CancellationToken.None);
using CancellationTokenSource wait = new();
wait.Cancel();
try
{
byte[] buf = new byte[64];
await client.ReceiveAsync(buf, wait.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("receive canceled");
}
Подключитесь к "ws://127.0.0.1:59991"
с уже отменённым ожиданием и выведите
"stopped", если вызов прервался.