1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-06-01 02:34:04 +02:00

Fix a race condition crash in update checker events

This commit is contained in:
chylex 2017-06-24 12:10:25 +02:00
parent 1087b5e1d1
commit 4800faa783
3 changed files with 29 additions and 33 deletions

View File

@ -104,7 +104,7 @@ public FormBrowser(PluginManager pluginManager, UpdaterSettings updaterSettings)
Config.MuteToggled += Config_MuteToggled; Config.MuteToggled += Config_MuteToggled;
Config.ZoomLevelChanged += Config_ZoomLevelChanged; Config.ZoomLevelChanged += Config_ZoomLevelChanged;
this.updates = new UpdateHandler(browser, this, updaterSettings); this.updates = new UpdateHandler(browser, updaterSettings);
this.updates.UpdateAccepted += updates_UpdateAccepted; this.updates.UpdateAccepted += updates_UpdateAccepted;
this.updates.UpdateDismissed += updates_UpdateDismissed; this.updates.UpdateDismissed += updates_UpdateDismissed;
@ -287,24 +287,28 @@ private void plugins_PluginChangedState(object sender, PluginChangedStateEventAr
} }
private void updates_UpdateAccepted(object sender, UpdateAcceptedEventArgs e){ private void updates_UpdateAccepted(object sender, UpdateAcceptedEventArgs e){
foreach(Form form in Application.OpenForms.Cast<Form>().Reverse()){ this.InvokeAsyncSafe(() => {
if (form is FormSettings || form is FormPlugins || form is FormAbout){ foreach(Form form in Application.OpenForms.Cast<Form>().Reverse()){
form.Close(); if (form is FormSettings || form is FormPlugins || form is FormAbout){
form.Close();
}
} }
}
updates.BeginUpdateDownload(this, e.UpdateInfo, update => { updates.BeginUpdateDownload(this, e.UpdateInfo, update => {
if (update.DownloadStatus == UpdateDownloadStatus.Done){ if (update.DownloadStatus == UpdateDownloadStatus.Done){
UpdateInstallerPath = update.InstallerPath; UpdateInstallerPath = update.InstallerPath;
} }
ForceClose(); ForceClose();
});
}); });
} }
private void updates_UpdateDismissed(object sender, UpdateDismissedEventArgs e){ private void updates_UpdateDismissed(object sender, UpdateDismissedEventArgs e){
Config.DismissedUpdate = e.VersionTag; this.InvokeAsyncSafe(() => {
Config.Save(); Config.DismissedUpdate = e.VersionTag;
Config.Save();
});
} }
private void soundNotification_PlaybackError(object sender, PlaybackErrorEventArgs e){ private void soundNotification_PlaybackError(object sender, PlaybackErrorEventArgs e){

View File

@ -98,13 +98,15 @@ private void btnCheckUpdates_Click(object sender, EventArgs e){
} }
private void updates_CheckFinished(object sender, UpdateCheckEventArgs e){ private void updates_CheckFinished(object sender, UpdateCheckEventArgs e){
if (e.EventId == updateCheckEventId){ this.InvokeAsyncSafe(() => {
btnCheckUpdates.Enabled = true; if (e.EventId == updateCheckEventId){
btnCheckUpdates.Enabled = true;
if (!e.UpdateAvailable){ if (!e.UpdateAvailable){
MessageBox.Show("Your version of "+Program.BrandName+" is up to date.", "No Updates Available", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("Your version of "+Program.BrandName+" is up to date.", "No Updates Available", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
} }
} });
} }
private void zoomUpdateTimer_Tick(object sender, EventArgs e){ private void zoomUpdateTimer_Tick(object sender, EventArgs e){

View File

@ -2,7 +2,6 @@
using CefSharp.WinForms; using CefSharp.WinForms;
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using TweetDuck.Core;
using TweetDuck.Core.Controls; using TweetDuck.Core.Controls;
using TweetDuck.Core.Utils; using TweetDuck.Core.Utils;
using TweetDuck.Resources; using TweetDuck.Resources;
@ -13,7 +12,6 @@ sealed class UpdateHandler{
private static bool IsSystemSupported => true; // Environment.OSVersion.Version >= new Version("6.1"); // 6.1 NT version = Windows 7 private static bool IsSystemSupported => true; // Environment.OSVersion.Version >= new Version("6.1"); // 6.1 NT version = Windows 7
private readonly ChromiumWebBrowser browser; private readonly ChromiumWebBrowser browser;
private readonly FormBrowser form;
private readonly UpdaterSettings settings; private readonly UpdaterSettings settings;
public event EventHandler<UpdateAcceptedEventArgs> UpdateAccepted; public event EventHandler<UpdateAcceptedEventArgs> UpdateAccepted;
@ -23,9 +21,8 @@ sealed class UpdateHandler{
private int lastEventId; private int lastEventId;
private UpdateInfo lastUpdateInfo; private UpdateInfo lastUpdateInfo;
public UpdateHandler(ChromiumWebBrowser browser, FormBrowser form, UpdaterSettings settings){ public UpdateHandler(ChromiumWebBrowser browser, UpdaterSettings settings){
this.browser = browser; this.browser = browser;
this.form = form;
this.settings = settings; this.settings = settings;
browser.FrameLoadEnd += browser_FrameLoadEnd; browser.FrameLoadEnd += browser_FrameLoadEnd;
@ -92,27 +89,20 @@ public void CleanupDownload(){
} }
public void DismissUpdate(string tag){ public void DismissUpdate(string tag){
settings.DismissedUpdate = tag; TriggerUpdateDismissedEvent(new UpdateDismissedEventArgs(tag));
UpdateDismissed?.Invoke(this, new UpdateDismissedEventArgs(tag));
} }
private void TriggerUpdateAcceptedEvent(UpdateAcceptedEventArgs args){ private void TriggerUpdateAcceptedEvent(UpdateAcceptedEventArgs args){
if (UpdateAccepted != null){ UpdateAccepted?.Invoke(this, args);
form.InvokeAsyncSafe(() => UpdateAccepted(this, args));
}
} }
private void TriggerUpdateDismissedEvent(UpdateDismissedEventArgs args){ private void TriggerUpdateDismissedEvent(UpdateDismissedEventArgs args){
form.InvokeAsyncSafe(() => { settings.DismissedUpdate = args.VersionTag;
settings.DismissedUpdate = args.VersionTag; UpdateDismissed?.Invoke(this, args);
UpdateDismissed?.Invoke(this, args);
});
} }
private void TriggerCheckFinishedEvent(UpdateCheckEventArgs args){ private void TriggerCheckFinishedEvent(UpdateCheckEventArgs args){
if (CheckFinished != null){ CheckFinished?.Invoke(this, args);
form.InvokeAsyncSafe(() => CheckFinished(this, args));
}
} }
public class Bridge{ public class Bridge{