Browse Source

Moved reconnect's Disconnect call to its separate task

tags/1.0-rc
RogueException 8 years ago
parent
commit
c678432b1a
2 changed files with 25 additions and 15 deletions
  1. +16
    -6
      src/Discord.Net/Rpc/DiscordRpcClient.cs
  2. +9
    -9
      src/Discord.Net/WebSocket/DiscordSocketClient.cs

+ 16
- 6
src/Discord.Net/Rpc/DiscordRpcClient.cs View File

@@ -122,6 +122,16 @@ namespace Discord.Rpc
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }
private async Task DisconnectAsync(Exception ex, bool isReconnecting)
{
if (_connectTask?.TrySetException(ex) ?? false) return;
await _connectionLock.WaitAsync().ConfigureAwait(false);
try
{
await DisconnectInternalAsync(ex, isReconnecting).ConfigureAwait(false);
}
finally { _connectionLock.Release(); }
}
private async Task DisconnectInternalAsync(Exception ex, bool isReconnecting) private async Task DisconnectInternalAsync(Exception ex, bool isReconnecting)
{ {
if (!isReconnecting) if (!isReconnecting)
@@ -152,19 +162,19 @@ namespace Discord.Rpc


private async Task StartReconnectAsync(Exception ex) private async Task StartReconnectAsync(Exception ex)
{ {
_connectTask?.TrySetException(ex);
await _connectionLock.WaitAsync().ConfigureAwait(false); await _connectionLock.WaitAsync().ConfigureAwait(false);
try try
{ {
if (!_canReconnect || _reconnectTask != null) return; if (!_canReconnect || _reconnectTask != null) return;
await DisconnectInternalAsync(null, true).ConfigureAwait(false);
_reconnectCancelToken = new CancellationTokenSource(); _reconnectCancelToken = new CancellationTokenSource();
_reconnectTask = ReconnectInternalAsync(_reconnectCancelToken.Token);
_reconnectTask = ReconnectInternalAsync(ex, _reconnectCancelToken.Token);
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }
private async Task ReconnectInternalAsync(CancellationToken cancelToken)
private async Task ReconnectInternalAsync(Exception ex, CancellationToken cancelToken)
{ {
await DisconnectAsync(null, true).ConfigureAwait(false);

try try
{ {
Random jitter = new Random(); Random jitter = new Random();
@@ -184,9 +194,9 @@ namespace Discord.Rpc
_reconnectTask = null; _reconnectTask = null;
return; return;
} }
catch (Exception ex)
catch (Exception ex2)
{ {
await _rpcLogger.WarningAsync("Reconnect failed", ex).ConfigureAwait(false);
await _rpcLogger.WarningAsync("Reconnect failed", ex2).ConfigureAwait(false);
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }


+ 9
- 9
src/Discord.Net/WebSocket/DiscordSocketClient.cs View File

@@ -191,13 +191,13 @@ namespace Discord.WebSocket
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }
private async Task DisconnectAsync(Exception ex)
private async Task DisconnectAsync(Exception ex, bool isReconnecting)
{ {
if (_connectTask?.TrySetException(ex) ?? false) return; if (_connectTask?.TrySetException(ex) ?? false) return;
await _connectionLock.WaitAsync().ConfigureAwait(false); await _connectionLock.WaitAsync().ConfigureAwait(false);
try try
{ {
await DisconnectInternalAsync(ex, false).ConfigureAwait(false);
await DisconnectInternalAsync(ex, isReconnecting).ConfigureAwait(false);
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }
@@ -259,19 +259,19 @@ namespace Discord.WebSocket


private async Task StartReconnectAsync(Exception ex) private async Task StartReconnectAsync(Exception ex)
{ {
_connectTask?.TrySetException(ex);
await _connectionLock.WaitAsync().ConfigureAwait(false); await _connectionLock.WaitAsync().ConfigureAwait(false);
try try
{ {
if (!_canReconnect || _reconnectTask != null) return; if (!_canReconnect || _reconnectTask != null) return;
await DisconnectInternalAsync(null, true).ConfigureAwait(false);
_reconnectCancelToken = new CancellationTokenSource(); _reconnectCancelToken = new CancellationTokenSource();
_reconnectTask = ReconnectInternalAsync(_reconnectCancelToken.Token);
_reconnectTask = ReconnectInternalAsync(ex, _reconnectCancelToken.Token);
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }
private async Task ReconnectInternalAsync(CancellationToken cancelToken)
private async Task ReconnectInternalAsync(Exception ex, CancellationToken cancelToken)
{ {
await DisconnectAsync(null, true).ConfigureAwait(false);

try try
{ {
Random jitter = new Random(); Random jitter = new Random();
@@ -291,9 +291,9 @@ namespace Discord.WebSocket
_reconnectTask = null; _reconnectTask = null;
return; return;
} }
catch (Exception ex)
catch (Exception ex2)
{ {
await _gatewayLogger.WarningAsync("Reconnect failed", ex).ConfigureAwait(false);
await _gatewayLogger.WarningAsync("Reconnect failed", ex2).ConfigureAwait(false);
} }
finally { _connectionLock.Release(); } finally { _connectionLock.Release(); }
} }
@@ -580,7 +580,7 @@ namespace Discord.WebSocket
} }
catch (Exception ex) catch (Exception ex)
{ {
await DisconnectAsync(new Exception("Processing READY failed", ex));
await DisconnectAsync(new Exception("Processing READY failed", ex), false);
return; return;
} }




Loading…
Cancel
Save