Просто вы не можете закрыть то, что не открыто. Методы SendAsync
, ReceiveAsync
, CloseAsync
, CloseOutputAsync
всегда проверяют состояние сокета, прежде чем предпринимать какие-либо другие действия. Если состояние не «связано», они выдают исключение.
Следующие состояния считаются «не связанными»:
WebSocketState.None
WebSocketState.Connecting
WebSocketState.Closed
Мы также можем добавить WebSocketState.Aborted
в список.
Принимая во внимание этот факт, если вы не ожидаете закрытия запроса или не отправляете его, вы можете закрыть свои сокеты следующим образом:
foreach (var socket in _sockets)
{
if (socket.State == WebSocketState.Open)
{
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
}
}
У меня нет видимости оставшихся частей вашего кода. Поэтому я предполагаю, что вы пытаетесь запустить метод CloseAsync
синхронно. Я рекомендую дважды подумать, прежде чем использовать Wait()
в асинхронном коде. Вы буквально блокируете текущий поток и ожидаете завершения Task
. Тебе это действительно нужно? Вы должны использовать async
как можно ниже. В противном случае вы можете легко зайти в тупик в асинхронном коде.