diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index b833ddd17..e4b0699aa 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -189,7 +189,7 @@ namespace Discord } catch (Exception ex) { - _taskManager.SignalError(ex, true); + _taskManager.SignalError(ex); throw; } } @@ -264,7 +264,7 @@ namespace Discord } /// Disconnects from the Discord server, canceling any pending requests. - public Task Disconnect() => _taskManager.Stop(); + public Task Disconnect() => _taskManager.Stop(true); private async Task Cleanup() { State = ConnectionState.Disconnecting; diff --git a/src/Discord.Net/Net/WebSockets/GatewaySocket.cs b/src/Discord.Net/Net/WebSockets/GatewaySocket.cs index b227c550e..35776a2db 100644 --- a/src/Discord.Net/Net/WebSockets/GatewaySocket.cs +++ b/src/Discord.Net/Net/WebSockets/GatewaySocket.cs @@ -63,7 +63,7 @@ namespace Discord.Net.WebSockets } catch (OperationCanceledException) { } } - public Task Disconnect() => _taskManager.Stop(); + public Task Disconnect() => _taskManager.Stop(true); protected override async Task Run() { diff --git a/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs b/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs index 5c1372d95..a5ac22392 100644 --- a/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs +++ b/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs @@ -76,7 +76,7 @@ namespace Discord.Net.WebSockets private void OnWebSocketError(object sender, ErrorEventArgs e) { - _taskManager.SignalError(e.Exception, isUnexpected: true); + _taskManager.SignalError(e.Exception); _waitUntilConnect.Set(); } private void OnWebSocketClosed(object sender, EventArgs e) @@ -86,7 +86,7 @@ namespace Discord.Net.WebSockets ex = new WebSocketException((e as ClosedEventArgs).Code, (e as ClosedEventArgs).Reason); else ex = new Exception($"Connection lost"); - _taskManager.SignalError(ex, isUnexpected: true); + _taskManager.SignalError(ex); _waitUntilConnect.Set(); } private void OnWebSocketOpened(object sender, EventArgs e) diff --git a/src/Discord.Net/Net/WebSockets/WebSocket.cs b/src/Discord.Net/Net/WebSockets/WebSocket.cs index 006c0d180..93fa641c5 100644 --- a/src/Discord.Net/Net/WebSockets/WebSocket.cs +++ b/src/Discord.Net/Net/WebSockets/WebSocket.cs @@ -95,7 +95,7 @@ namespace Discord.Net.WebSockets } catch (Exception ex) { - _taskManager.SignalError(ex, true); + _taskManager.SignalError(ex); throw; } } @@ -111,7 +111,7 @@ namespace Discord.Net.WebSockets } catch (Exception ex) { - _taskManager.SignalError(ex, true); + _taskManager.SignalError(ex); } } @@ -132,7 +132,7 @@ namespace Discord.Net.WebSockets Logger.Info("Disconnected"); else Logger.Error("Disconnected", ex); - OnDisconnected(_taskManager.WasUnexpected, _taskManager.Exception); + OnDisconnected(!_taskManager.WasStopExpected, _taskManager.Exception); } State = ConnectionState.Disconnected; } diff --git a/src/Discord.Net/TaskManager.cs b/src/Discord.Net/TaskManager.cs index 376a6aa1e..a3ce95029 100644 --- a/src/Discord.Net/TaskManager.cs +++ b/src/Discord.Net/TaskManager.cs @@ -16,8 +16,8 @@ namespace Discord private CancellationTokenSource _cancelSource; private Task _task; - public bool WasUnexpected => _wasStopUnexpected; - private bool _wasStopUnexpected; + public bool WasStopExpected => _wasStopExpected; + private bool _wasStopExpected; public Exception Exception => _stopReason?.SourceException; private ExceptionDispatchInfo _stopReason; @@ -53,7 +53,7 @@ namespace Discord continue; //Another thread sneaked in and started this manager before we got a lock, loop and try again _stopReason = null; - _wasStopUnexpected = false; + _wasStopExpected = false; Task[] tasksArray = tasks.ToArray(); Task anyTask = Task.WhenAny(tasksArray); @@ -66,7 +66,7 @@ namespace Discord //Signal the rest of the tasks to stop if (firstTask.Exception != null) - SignalError(firstTask.Exception, true); + SignalError(firstTask.Exception); else SignalStop(); @@ -84,10 +84,13 @@ namespace Discord } } - public void SignalStop() + public void SignalStop(bool isExpected = false) { lock (_lock) { + if (isExpected) + _wasStopExpected = true; + if (_task == null) return; //Are we running? if (_cancelSource.IsCancellationRequested) return; @@ -95,11 +98,14 @@ namespace Discord _cancelSource.Cancel(); } } - public Task Stop() + public Task Stop(bool isExpected = false) { Task task; lock (_lock) { + if (isExpected) + _wasStopExpected = true; + //Cache the task so we still have something to await if Cleanup is run really quickly task = _task; if (task == null) return TaskHelper.CompletedTask; //Are we running? @@ -111,19 +117,18 @@ namespace Discord return task; } - public void SignalError(Exception ex, bool isUnexpected = true) + public void SignalError(Exception ex) { lock (_lock) { if (_stopReason != null) return; _stopReason = ExceptionDispatchInfo.Capture(ex); - _wasStopUnexpected = isUnexpected; if (_cancelSource != null) _cancelSource.Cancel(); } } - public Task Error(Exception ex, bool isUnexpected = true) + public Task Error(Exception ex) { Task task; lock (_lock) @@ -135,7 +140,6 @@ namespace Discord if (_cancelSource.IsCancellationRequested) return task; _stopReason = ExceptionDispatchInfo.Capture(ex); - _wasStopUnexpected = isUnexpected; if (_cancelSource != null) _cancelSource.Cancel(); } @@ -153,7 +157,7 @@ namespace Discord lock (_lock) { _stopReason = null; - _wasStopUnexpected = false; + _wasStopExpected = false; } } }