private void ListRefreshThread(LoadingDialog.LoadingDialogInterface dialogInterface)
        {
            dialogInterface.SetMaximum(1);
            dialogInterface.SetProgress(0);

            var detectedUninstallers =
                new List <ApplicationUninstallerEntry>(ApplicationUninstallerManager.GetUninstallerList(x =>
            {
                if (x.CurrentCount == 1)
                {
                    dialogInterface.SetMaximum(x.TotalCount * 2);
                }
                dialogInterface.SetProgress(x.CurrentCount);
            }));

            detectedUninstallers.AddRange(
                ApplicationUninstallerManager.GetApplicationsFromDrive(detectedUninstallers, x =>
            {
                dialogInterface.SetProgress(x.TotalCount + x.CurrentCount);
                if (x.CurrentCount == 1)
                {
                    dialogInterface.SetMaximum(x.TotalCount * 2);
                }
            }));

            if (Program.IsInstalled)
            {
                detectedUninstallers.RemoveAll(entry => entry.RegistryKeyName.IsNotEmpty() &&
                                               entry.RegistryKeyName.Equals(Program.InstalledRegistryKeyName,
                                                                            StringComparison.InvariantCultureIgnoreCase));
            }

            if (_settings.Settings.QuietAutomatization && Program.Net4IsAvailable)
            {
                QuietUninstallTools.GenerateQuietCommands(detectedUninstallers, _settings.Settings.QuietAutomatizationKillStuck);
            }

            try
            {
                detectedUninstallers.AddRange(ApplicationUninstallerManager.GetWindowsFeaturesList());
            }
            catch (Exception ex)
            {
                PremadeDialogs.GenericError(ex);
            }

            AllUninstallers = detectedUninstallers;

            dialogInterface.SetProgress(1);
            dialogInterface.SetMaximum(1);

            try
            {
                _iconGetter.UpdateIconList(detectedUninstallers);
            }
            catch (Exception ex)
            {
                PremadeDialogs.GenericError(ex);
            }

            try
            {
                ReassignStartupEntries(false);
            }
            catch (Exception ex)
            {
                PremadeDialogs.GenericError(ex);
            }
        }
        public void RunUninstall(IEnumerable <ApplicationUninstallerEntry> selectedUninstallers,
                                 IEnumerable <ApplicationUninstallerEntry> allUninstallers, bool quiet)
        {
            if (!TryGetUninstallLock())
            {
                return;
            }
            var listRefreshNeeded = false;

            try
            {
                var targets = new List <ApplicationUninstallerEntry>(selectedUninstallers);

                if (!_settings.AdvancedDisableProtection)
                {
                    var protectedTargets = targets.Where(x => x.IsProtected).ToList();
                    if (
                        MessageBoxes.ProtectedItemsWarningQuestion(protectedTargets.Select(x => x.DisplayName).ToArray()) ==
                        MessageBoxes.PressedButton.Cancel)
                    {
                        return;
                    }

                    targets.RemoveAll(protectedTargets);
                }

                if (targets.Any())
                {
                    _lockApplication(true);

                    // Steam will be required to run loud steam app uninstalls
                    if (!CheckForRunningProcessesBeforeUninstall(targets, !quiet))
                    {
                        return;
                    }

                    if (!SystemRestore.BeginSysRestore(targets.Count))
                    {
                        return;
                    }

                    // No turning back at this point (kind of)
                    listRefreshNeeded = true;

                    if (_settings.ExternalEnable && _settings.ExternalPreCommands.IsNotEmpty())
                    {
                        LoadingDialog.ShowDialog(Localisable.LoadingDialogTitlePreUninstallCommands,
                                                 controller => { RunExternalCommands(_settings.ExternalPreCommands, controller); });
                    }

                    var status = ApplicationUninstallerManager.RunBulkUninstall(targets, GetConfiguration(quiet));
                    status.OneLoudLimit = _settings.UninstallConcurrentOneLoud;
                    status.ConcurrentUninstallerCount = _settings.UninstallConcurrency
                        ? _settings.UninstallConcurrentMaxCount
                        : 1;
                    status.Start();

                    using (var uninstallWindow = new UninstallProgressWindow())
                    {
                        uninstallWindow.Shown += (sender, args) => ((UninstallProgressWindow)sender).SetTargetStatus(status);
                        uninstallWindow.ShowDialog(MessageBoxes.DefaultOwner);
                    }

                    var junkRemoveTargetsQuery = from bulkUninstallEntry in status.AllUninstallersList
                                                 where bulkUninstallEntry.CurrentStatus == UninstallStatus.Completed ||
                                                 bulkUninstallEntry.CurrentStatus == UninstallStatus.Invalid ||
                                                 (bulkUninstallEntry.CurrentStatus == UninstallStatus.Skipped &&
                                                  !bulkUninstallEntry.UninstallerEntry.RegKeyStillExists())
                                                 select bulkUninstallEntry.UninstallerEntry;

                    SearchForAndRemoveJunk(junkRemoveTargetsQuery, allUninstallers);

                    if (_settings.ExternalEnable && _settings.ExternalPostCommands.IsNotEmpty())
                    {
                        LoadingDialog.ShowDialog(Localisable.LoadingDialogTitlePostUninstallCommands,
                                                 controller => { RunExternalCommands(_settings.ExternalPostCommands, controller); });
                    }

                    SystemRestore.EndSysRestore();
                }
                else
                {
                    MessageBoxes.NoUninstallersSelectedInfo();
                }
            }
            finally
            {
                ReleaseUninstallLock();
                _lockApplication(false);
                if (listRefreshNeeded)
                {
                    _initiateListRefresh();
                }
            }
        }