Вопрос BackgroundWorker и открыть новую страницу - PullRequest
0 голосов
/ 10 апреля 2019

Я использую BackgroundWorker для создания некоторых событий, например:

        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerAsync();

внутри DoWork, у меня есть:

void Worker_DoWork(object sender, DoWorkEventArgs e)
    {

        int totalExecucao = 2;
        int count = 0;

        setMensagemText(count++, "Verificando Banco de dados...", totalExecucao);
        VerificaDataBase();

        setMensagemText(count++, "Verificando Configurações Locais", totalExecucao);
        verificaConfiguracaoLocal();


        worker.ReportProgress(100);

        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
        {
            MainWindow mw = new MainWindow();
            mw.Show();
            this.Close();
        }));

Я должен проверить "configurações locais", если нетзарегистрируйтесь, я должен открыть страницу, и пользователю нужно сделать некоторые настройки и сохранить, после этого для завершения откройте форму MainView, чтобы проверить, что я использую этот код:

private void verificaConfiguracaoLocal()
    {
        LocalBean localBean = new LocalBean();
        localBean.CarregaModel();


        if (localBean.Model.Id > -1)
        //if(localBean.Model.Id == 0)
        {


            Thread novaNotificacao = new Thread(new ThreadStart(Notify));
            novaNotificacao.SetApartmentState(ApartmentState.STA);
            novaNotificacao.Start();
            worker.CancelAsync();
            void Notify()
            {
                LocalPage lp = new LocalPage();
                Window win2 = new Window();
                win2.Content = lp;
                win2.Show();
            }
        }
    }

Что происходит в процессе Страница открытаи закрывается автоматически, по очереди он собирается к следующей проверке, в этом случае открывается MainWindow.

Я должен: При открытии формы мне нужно, чтобы BackgroundWorker подождал, пока пользователь закроет Win2, и после этого продолжит проверку

РЕДАКТИРОВАТЬ =============================================================================

Я пытался:

private AutoResetEvent _workerCompleted = new AutoResetEvent(false);
setMensagemText(count++, "Verificando Banco de dados...", totalExecucao);
        VerificaDataBase();
        _workerCompleted.WaitOne();

        setMensagemText(count++, "Verificando Configurações Locais", totalExecucao);
        verificaConfiguracaoLocal();
        _workerCompleted.WaitOne();

private void verificaConfiguracaoLocal()
    {
        LocalBean localBean = new LocalBean();
        localBean.CarregaModel();

        verificaAbrirPage(localBean.Model.Id, typeof(LocalPage));

        if (LocalBean.ModelStatic.Id.Equals(0))
        {
            NotificacaoUtil.Error("Para o sistema carregar corretamente, é necessário ter uma configuração local. O sistema será finalizado!");
            Environment.Exit(0);
        }


    }

private void verificaAbrirPage(long id, Type page)
    {
        if (id.Equals(0))
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                Page lp = (Page)Activator.CreateInstance(page);
                Window win2 = new Window();
                win2.Content = lp;
                win2.Closed += (s, a) =>
                {
                    _workerCompleted.Set();
                };
                win2.Show();
            }));
        }
        else
        {
            _workerCompleted.Set();
        }
    }

но продолжаю не работать

...