public async Task ConnectAsync(System.Uri uri) { try { await DisconnectAsync().ConfigureAwait(false); } catch { // ignored } await Locker.WaitAsync().ConfigureAwait(false); try { SocketTokenSource?.Dispose(); ReceiverTokenSource?.Dispose(); SocketTokenSource = new CancellationTokenSource(); SocketToken = SocketTokenSource.Token; ReceiverTokenSource = new CancellationTokenSource(); ReceiverToken = ReceiverTokenSource.Token; IsClientClosed = false; ClientWebSocket?.Dispose(); ClientWebSocket = new ClientWebSocket { Options = { KeepAliveInterval = TimeSpan.Zero, } }; if (Options.WebProxy != null) { ClientWebSocket.Options.Proxy = Options.WebProxy; } if (Options.Headers.Any()) { foreach (var(k, v) in Options.Headers) { ClientWebSocket.Options.SetRequestHeader(k, v); } } await ClientWebSocket.ConnectAsync(uri, SocketToken).ConfigureAwait(false); ReadTask = Task.Run(ReadAsync, ReceiverToken); } finally { Locker.Release(); } }
public void Dispose() { if (IsDisposed) { return; } IsDisposed = true; DisconnectAsync().GetAwaiter().GetResult(); SocketTokenSource.Dispose(); ReceiverTokenSource.Dispose(); }
public async Task DisconnectAsync(int code = 1000, string message = "") { // ReSharper disable once MethodSupportsCancellation await Locker.WaitAsync().ConfigureAwait(false); try { IsClientClosed = true; if (ClientWebSocket != null) { await ClientWebSocket.CloseOutputAsync((WebSocketCloseStatus)code, message, CancellationToken.None) .ConfigureAwait(false); } if (ReadTask != null) { await ReadTask.ConfigureAwait(false); } if (IsConnected) { IsConnected = false; } SocketTokenSource?.Cancel(); SocketTokenSource?.Dispose(); ReceiverTokenSource?.Cancel(); ReceiverTokenSource?.Dispose(); } catch { // ignored } finally { Locker.Release(); } }