diff --git a/Abstract/SocketClient.cs b/Abstract/SocketClient.cs index 85633d5..b161533 100644 --- a/Abstract/SocketClient.cs +++ b/Abstract/SocketClient.cs @@ -9,7 +9,6 @@ namespace CommonSocketLibrary.Abstract public abstract class SocketClient : IDisposable where Message : class { protected ClientWebSocket? _socket; - protected CancellationTokenSource? _cts; private readonly int ReceiveBufferSize = 8192; protected readonly ILogger _logger; @@ -42,21 +41,18 @@ namespace CommonSocketLibrary.Abstract _socket.Options.RemoteCertificateValidationCallback = (o, c, ch, er) => true; _socket.Options.UseDefaultCredentials = false; _disposed = false; - if (_cts != null) _cts.Dispose(); - _cts = new CancellationTokenSource(); - await _socket.ConnectAsync(new Uri(url), _cts.Token); - await Task.Factory.StartNew(ReceiveLoop, _cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + await _socket.ConnectAsync(new Uri(url), CancellationToken.None); + await Task.Factory.StartNew(ReceiveLoop, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); OnConnected?.Invoke(this, EventArgs.Empty); } public async Task DisconnectAsync(SocketDisconnectionEventArgs args) { - if (_disposed || _socket == null || _cts == null) + if (_disposed || _socket == null) return; if (_socket.State == WebSocketState.Open) { - _cts.CancelAfter(TimeSpan.FromMilliseconds(500)); await _socket.CloseOutputAsync(WebSocketCloseStatus.Empty, "", CancellationToken.None); await _socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); } @@ -64,11 +60,9 @@ namespace CommonSocketLibrary.Abstract OnDisconnected?.Invoke(this, args); _socket.Dispose(); _socket = null; - _cts.Dispose(); - _cts = null; } - protected virtual async Task Deserialize(Stream stream) + protected virtual async Task Deserialize(Stream stream) { return await JsonSerializer.DeserializeAsync(stream, _options); } @@ -83,22 +77,20 @@ namespace CommonSocketLibrary.Abstract private async Task ReceiveLoop() { - if (_socket == null || _cts == null) return; + if (_socket == null) return; - var loopToken = _cts.Token; MemoryStream? outputStream = null; WebSocketReceiveResult? receiveResult = null; var buffer = new byte[ReceiveBufferSize]; try { - while (!loopToken.IsCancellationRequested) + while (_socket.State == WebSocketState.Open || _socket.State == WebSocketState.CloseSent) { outputStream = new MemoryStream(ReceiveBufferSize); do { - receiveResult = await _socket.ReceiveAsync(buffer, _cts.Token); - if (receiveResult.MessageType != WebSocketMessageType.Close) - outputStream.Write(buffer, 0, receiveResult.Count); + receiveResult = await _socket.ReceiveAsync(buffer, CancellationToken.None); + outputStream.Write(buffer, 0, receiveResult.Count); } while (!receiveResult.EndOfMessage); if (receiveResult.MessageType == WebSocketMessageType.Close) break; @@ -109,7 +101,7 @@ namespace CommonSocketLibrary.Abstract catch (WebSocketException wse) { string data = string.Join(string.Empty, wse.Data.Cast().Select(e => e.Key + "=" + e.Value)); - _logger.Error($"Websocket connection problem while receiving data [state: {_socket.State}][code: {wse.ErrorCode}][data: {data}]"); + _logger.Error(wse, $"Websocket connection problem while receiving data [state: {_socket.State}][code: {wse.ErrorCode}][data: {data}]"); } catch (TaskCanceledException) { diff --git a/Common/WebSocketClient.cs b/Common/WebSocketClient.cs index 97bb494..2492333 100644 --- a/Common/WebSocketClient.cs +++ b/Common/WebSocketClient.cs @@ -73,7 +73,7 @@ namespace CommonSocketLibrary.Common while (current < total) { var size = Encoding.UTF8.GetBytes(content.Substring(current), array); - await _socket!.SendAsync(array, WebSocketMessageType.Text, current + size >= total, _cts!.Token); + await _socket!.SendAsync(array, WebSocketMessageType.Text, current + size >= total, CancellationToken.None); current += size; } _logger.Verbose("TX #" + opcode + ": " + content);