/// <summary> /// Performs an update to the value if necessary. /// </summary> public void Update() { CheckAccess(); if (HasExpired) { try { if (_updater != null) { Value = _updater.Invoke(); } } catch (Exception ex) { if (UpdateErrorCallback == null && UpdateError == null) { throw; } else { UpdateErrorCallback?.Invoke(this, new UpdateErrorEventArgs(ex)); UpdateError?.Invoke(this, new UpdateErrorEventArgs(ex)); } } } }
public void ExecuteUpdate() { _downloadWorker = new BackgroundWorker() { WorkerSupportsCancellation = true, WorkerReportsProgress = true }; _downloadWorker.DoWork += (s, e) => { var fileRequest = WebRequest.Create(Manifest.PackageUrl); var fileResponse = fileRequest.GetResponse(); InstallerPath = Path.GetTempPath() + @"\" + GetFilenameFromUrl(Manifest.PackageUrl); using (var stream = fileResponse.GetResponseStream()) { ReadStreamToFile(stream, InstallerPath, (int)fileResponse.ContentLength); } if (_downloadWorker.CancellationPending) { e.Cancel = true; } else { CheckSignature(InstallerPath); // will throw on error } }; _downloadWorker.RunWorkerCompleted += (s, e) => { if (e.Cancelled) { Logger.Warn("update cancelled"); UpdateComplete?.Invoke(this, EventArgs.Empty); } else if (e.Error != null) { Logger.WarnException("an error occured processing update", e.Error); UpdateError?.Invoke(e.Error, EventArgs.Empty); } else { Process.Start(InstallerPath); Thread.Sleep(2000); UpdateComplete?.Invoke(this, EventArgs.Empty); App.Shutdown(); } }; _downloadWorker.ProgressChanged += (s, e) => { ProgressUpdate?.Invoke(e.ProgressPercentage); }; _downloadWorker.RunWorkerAsync(); }