public void HandleConfigChanged() { // Do not verify if change occurred as this function is going to be called again in that case // Do not verify the config in case the bot token has been changed, as the client will be restarted and that will trigger verification bool tokenChanged = Data.BotToken != _prevConfig.BotToken; bool correctionMade = !Save(); BuildChanneLinkList(); if (tokenChanged) { OnTokenChanged?.Invoke(this, EventArgs.Empty); return; // The token changing will trigger a reset } if (!correctionMade) // If a correction was made, this function will be called again { VerifyConfig(); // This function executes on the GUI thread and therefore async calls will trigger deadlocks. // We execute the callbacks on a separate joined thread to avoid these deadlocks. SystemUtil.SynchronousThreadExecute(() => { OnConfigChanged?.Invoke(this, EventArgs.Empty); }); } }
void StopClient() { _status = "Shutting down"; // Stop various timers that may have been set up so they do not trigger while the reset is ongoing DLConfig.Instance.DequeueAllVerification(); SystemUtil.StopAndDestroyTimer(ref _discordDataMaybeAvailable); ShutdownModules(); if (DiscordClient != null) { StopRelaying(); // If DisconnectAsync() is called in the GUI thread, it will cause a deadlock SystemUtil.SynchronousThreadExecute(() => { DiscordClient.DisconnectAsync().Wait(); }); DiscordClient.Dispose(); DiscordClient = null; OnClientStopped?.Invoke(this, EventArgs.Empty); } }