public async Task DisconnectAsync() { if (WS is null) { return; } // TODO: requests cleanup code, sub-protocol dependent. if (WS.State == WebSocketState.Open) { CTS.CancelAfter(TimeSpan.FromSeconds(2)); await WS.CloseOutputAsync(WebSocketCloseStatus.Empty, "", CancellationToken.None); await WS.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); } WS.Dispose(); WS = null; CTS.Dispose(); CTS = null; }