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;
}
}
}