private async Task <bool> UpdateServerAsync(Server server, bool establishLock, bool updateServer, bool updateMods, bool closeProgressWindow) { if (server == null) { return(false); } if (_upgradeCancellationSource != null) { // display an error message and exit MessageBox.Show(_globalizer.GetResourceString("ServerMonitor_UpgradeServer_FailedLabel"), _globalizer.GetResourceString("ServerMonitor_UpgradeServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Information); return(false); } ProgressWindow window = null; Mutex mutex = null; bool createdNew = !establishLock; var serverProfile = server.Profile; try { if (establishLock) { // try to establish a mutex for the profile. mutex = new Mutex(true, ServerApp.GetMutexName(serverProfile.InstallDirectory), out createdNew); } // check if the mutex was established if (createdNew) { _upgradeCancellationSource = new CancellationTokenSource(); window = new ProgressWindow(string.Format(_globalizer.GetResourceString("Progress_UpgradeServer_WindowTitle"), serverProfile.ProfileName)) { Owner = Window.GetWindow(this) }; window.Closed += Window_Closed; window.Show(); await Task.Delay(1000); var branch = new BranchSnapshot() { BranchName = serverProfile.BranchName, BranchPassword = serverProfile.BranchPassword }; return(await server.UpgradeAsync(_upgradeCancellationSource.Token, updateServer, branch, true, updateMods, (p, m, n) => { TaskUtils.RunOnUIThreadAsync(() => { window?.AddMessage(m, n); }).DoNotWait(); })); } else { // display an error message and exit MessageBox.Show(_globalizer.GetResourceString("ServerSettings_UpgradeServer_MutexFailedLabel"), _globalizer.GetResourceString("ServerSettings_UpgradeServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Information); return(false); } } catch (Exception ex) { if (window != null) { window.AddMessage(ex.Message); window.AddMessage(ex.StackTrace); } MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_UpgradeServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Error); return(false); } finally { _upgradeCancellationSource = null; if (window != null) { window.CloseWindow(); if (closeProgressWindow) { window.Close(); } } if (mutex != null) { if (createdNew) { mutex.ReleaseMutex(); mutex.Dispose(); } mutex = null; } } }