/// <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));
                    }
                }
            }
        }
Exemple #2
0
        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();
        }