public Task <UpdateResult> UpdateAsync()
        {
            return(Task.Run <UpdateResult>(() =>
            {
                try
                {
                    WaitForInitializationToComplete();
                    var ext = Path.GetExtension(_installerLocation);
                    var tempFile = Path.ChangeExtension(Path.GetTempFileName(), ext);

                    if (!CopyFile(_installerLocation, tempFile))
                    {
                        return UpdateResult.DownloadFailed;
                    }

                    using (var trustVerifier = new TrustVerifier(tempFile))
                    {
                        if (!trustVerifier.IsVerified)
                        {
                            return UpdateResult.VerificationFailed;
                        }
                        UpdateMethods.BeginMSIInstall(tempFile);
                    }

                    return UpdateResult.Success;
                }
                catch (Exception e)
                {
                    e.ReportException();
                    return UpdateResult.Unknown;
                }
            }));
        }
        private AutoUpdateOption Initialize()
        {
            // Do NOT use anything that calls WaitForInitializationToComplete in this
            // method, or you may create a deadlock condition
            try
            {
                OverridableConfig config = new OverridableConfig(ConfigFile);
                _releaseLocation = UpdateMethods.GetReleaseLocation(config);
                _metaMSISettings = UpdateMethods.ExtractMSIInfo(_releaseLocation);

                if (_metaMSISettings == null)
                {
                    // silently ignore
                    System.Diagnostics.Trace.WriteLine($"Unable to get update info from meta file at {_releaseLocation}");
                    return(AutoUpdateOption.Unknown);
                }

                _installerLocation = _metaMSISettings.GetMSIPathSafely(_releaseLocation);
#pragma warning disable CA1806 // Do not ignore method results
                Version.TryParse(_metaMSISettings.Version, out _latestVersion);
                Version.TryParse(_metaMSISettings.MinimumVersion, out _minimumVersion);
                Version.TryParse(UpdateMethods.GetInstalledProductVersion(), out _installedVersion);
#pragma warning restore CA1806 // Do not ignore method results

                if (_installedVersion != null && _latestVersion != null && _minimumVersion != null)
                {
                    if (_latestVersion < _minimumVersion)
                    {
                        return(AutoUpdateOption.Unknown);
                    }
                    if (_installedVersion < _minimumVersion)
                    {
                        return(AutoUpdateOption.RequiredUpgrade);
                    }
                    else if (_installedVersion < _latestVersion)
                    {
                        return(AutoUpdateOption.OptionalUpgrade);
                    }
                    return(AutoUpdateOption.Current);
                }
            }
            catch (Exception e)
            {
                e.ReportException();
            }
            return(AutoUpdateOption.Unknown);  // Our fallback value if we can't prove a better option
        }