diff --git a/src/Discord.Net/Audio/AudioClient.cs b/src/Discord.Net/Audio/AudioClient.cs index cc357a910..a6cb71b21 100644 --- a/src/Discord.Net/Audio/AudioClient.cs +++ b/src/Discord.Net/Audio/AudioClient.cs @@ -230,7 +230,7 @@ namespace Discord.Audio _secretKey = data.SecretKey; await ApiClient.SendSetSpeaking(true).ConfigureAwait(false); - _connectTask.TrySetResult(true); + var _ = _connectTask.TrySetResultAsync(true); } break; case VoiceOpCode.HeartbeatAck: diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index da21aa7a6..cba5f286b 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -530,8 +530,8 @@ namespace Discord await _readyEvent.InvokeAsync().ConfigureAwait(false); await SyncGuildsAsync().ConfigureAwait(false); - - _connectTask.TrySetResult(true); //Signal the .Connect() call to complete + + var _ = Task.Run(() => _connectTask.TrySetResult(true)); //Signal the .Connect() call to complete await _gatewayLogger.InfoAsync("Ready").ConfigureAwait(false); } break; diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs index 5e96181e5..95a549610 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs @@ -96,9 +96,9 @@ namespace Discord AddUser(model.Members[i], dataStore, members); if (Discord.ApiClient.AuthTokenType != TokenType.User) { - _syncPromise.TrySetResult(true); + var _ = _syncPromise.TrySetResultAsync(true); if (!model.Large) - _downloaderPromise.TrySetResult(true); + _ = _downloaderPromise.TrySetResultAsync(true); } for (int i = 0; i < model.Presences.Length; i++) @@ -122,9 +122,9 @@ namespace Discord DownloadedMemberCount = 0; for (int i = 0; i < model.Members.Length; i++) AddUser(model.Members[i], dataStore, members); - _syncPromise.TrySetResult(true); + var _ = _syncPromise.TrySetResultAsync(true); if (!model.Large) - _downloaderPromise.TrySetResult(true); + _ = _downloaderPromise.TrySetResultAsync(true); for (int i = 0; i < model.Presences.Length; i++) AddOrUpdateUser(model.Presences[i], dataStore, members); @@ -233,7 +233,7 @@ namespace Discord } public void CompleteDownloadMembers() { - _downloaderPromise.TrySetResult(true); + _downloaderPromise.TrySetResultAsync(true); } public VoiceState AddOrUpdateVoiceState(VoiceStateModel model, DataStore dataStore, ConcurrentDictionary voiceStates = null) diff --git a/src/Discord.Net/Extensions/TaskCompletionSourceExtensions.cs b/src/Discord.Net/Extensions/TaskCompletionSourceExtensions.cs new file mode 100644 index 000000000..a5a715b4c --- /dev/null +++ b/src/Discord.Net/Extensions/TaskCompletionSourceExtensions.cs @@ -0,0 +1,23 @@ +using System; +using System.Threading.Tasks; + +namespace Discord +{ + internal static class TaskCompletionSourceExtensions + { + public static Task SetResultAsync(this TaskCompletionSource source, T result) + => Task.Run(() => source.SetResult(result)); + public static Task TrySetResultAsync(this TaskCompletionSource source, T result) + => Task.Run(() => source.TrySetResult(result)); + + public static Task SetExceptionAsync(this TaskCompletionSource source, Exception ex) + => Task.Run(() => source.SetException(ex)); + public static Task TrySetExceptionAsync(this TaskCompletionSource source, Exception ex) + => Task.Run(() => source.TrySetException(ex)); + + public static Task SetCanceledAsync(this TaskCompletionSource source) + => Task.Run(() => source.SetCanceled()); + public static Task TrySetCanceledAsync(this TaskCompletionSource source) + => Task.Run(() => source.TrySetCanceled()); + } +} diff --git a/src/Discord.Net/Net/Queue/RequestQueueBucket.cs b/src/Discord.Net/Net/Queue/RequestQueueBucket.cs index 3c914315d..e5feb11a4 100644 --- a/src/Discord.Net/Net/Queue/RequestQueueBucket.cs +++ b/src/Discord.Net/Net/Queue/RequestQueueBucket.cs @@ -141,7 +141,7 @@ namespace Discord.Net.Queue private async Task QueueResumeAsync(TaskCompletionSource resumeNotifier, int millis) { await Task.Delay(millis).ConfigureAwait(false); - resumeNotifier.SetResult(0); + resumeNotifier.TrySetResultAsync(0); } private async Task EnterAsync(int? endTick)