Индикатор выполнения не работает должным образом в фоновом режиме - PullRequest
0 голосов
/ 18 января 2020

Мне нужно иметь индикатор выполнения для работы (видимый) во время одного процесса, после которого видимость должна быть установлена ​​в false. Я использую фоновый рабочий для этого процесса. но при использовании свойства видимости приложение останавливается, иначе приложение работает правильно. Я использую индикатор прогресса Dev express. Пожалуйста, помогите мне с этим. Это код, который я работаю.

private void Generate_Click(object sender, EventArgs e)
    {
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.RunWorkerAsync();
    }
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int a = 0;
        int b = 0;
        ProgressBar.Visible = true;
        ProgressBar.Properties.Step = 1;
        ProgressBar.Properties.PercentView = true;
        ProgressBar.Properties.Maximum = SpecInformations.TotalSPCOCount;
        ProgressBar.Properties.Minimum = 0;
        Method_Call(a,b, sender as BackgroundWorker);
    }

    private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ProgressBar.PerformStep();
        ProgressBar.Update();
    }

    private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        ProgressBar.Visible = false;
    }

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Вы не можете получить доступ к Windows элементам управления, таким как ProgressBar, из метода DoWork или любого вызванного им метода, поскольку поток, выполняющий этот код, является фоновым потоком, а не тем же потоком, который создал элемент управления. Вы получите исключение, в сообщении которого говорится, что доступ к элементу управления осуществляется потоком, отличным от потока, который его создал, если вы попытаетесь. Это нерушимое правило о windows элементах управления; к ним всегда должен обращаться только поток, создавший их

BackgroundWorker имеет свойство WorkerReportsProgress, которое должно быть установлено в true, и метод ReportProgress(), который можно вызывать с помощью int (и передавать необязательный объект для получения дополнительной информации) процент завершения. Когда вы вызываете этот метод в DoWork, BackgroundWorker автоматически вызывает событие ProgressChanged и, что очень важно, делает это, используя поток переднего плана, в котором он был создан (тот же поток, в котором были созданы другие элементы управления), поэтому код внутри обработчика события ProgressChanged имеет вид выполняется с использованием соответствующего потока и может обращаться к элементу управления ProgressBar, не вызывая исключения

В итоге:

  • Установите для WorkerReportsProgress значение true
  • Вызовите ReportProgress внутри DoWork, передав Процент завершения или использование int для указания того, что процесс достиг какой-то стадии (это не должен быть процент)
  • Присоединение обработчика событий к событию ProgressChanged вашего работника
  • Перемещение кода ProgressBar в обработчик событий ProgressChanged
0 голосов
/ 18 января 2020

код может помочь вам использовать индикатор выполнения в BackgroundWorker:

private void cmdButton_Click(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerAsync();
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 0; i < 101; i++)
        {
            worker.ReportProgress(i);
            System.Threading.Thread.Sleep(1000);
        }
    }

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lblProgress.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%");
    }

для получения дополнительной информации можно использовать ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...