backgroundWorker_ProgressChanged не работает? - PullRequest
2 голосов
/ 27 января 2012

У меня проблема с фоновым работником

private void backgroundPBar_ProgressChanged(object sender, ProgressChangedEventArgs e)

Функция не выполняется, когда backgroundPBar.ReportProgress (значение);

, вот код:

private void backgroundPBar_DoWork(object sender, DoWorkEventArgs e) {
    while (fileTransfer.busy) {
        if (fileTransfer.sum > 0) {
            int value = Convert.ToInt32((fileTransfer.sum * 100) / fileTransfer.fileSize);
            backgroundPBar.ReportProgress(value);
            Console.WriteLine(value);
        }
    }
}

private void backgroundPBar_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    progressBarFile.Value = e.ProgressPercentage;
    this.Text = e.ProgressPercentage.ToString() + "%";
}

Как я могу это исправить?

Ответы [ 4 ]

2 голосов
/ 27 января 2012

не забывайте, что для использования метода ReportProgress() вы должны установить WorkerReportsProgress как true.

2 голосов
/ 27 января 2012

Убедитесь, что у вас есть событие прогресса:

backgroundPBar.ProgressChanged += backgroundPBar_ProgressChanged

Из вашего описания, похоже, что это не так. Здесь предполагается, что fileTransfer.busy верно и fileTransfer.sum > 0 также верно.

Также убедитесь, что у вас установлены свойства фонового рабочего:

backgroundPBar.WorkerReportsProgress = true;

(как я вижу "Маска" упоминается ").

0 голосов
/ 16 ноября 2012

У меня возникли проблемы с немедленным срабатыванием события ProgressChanged при вызове метода ReportProgress.Поскольку они являются отдельными потоками, мне пришлось прибегнуть к синхронизации потоков.Я использовал пару WaitHandles и метод SignalAndWait для синхронизации двух потоков.Я вроде бы побеждал назначение фонового работника, но если я действительно хочу, чтобы поток пользовательского интерфейса делал что-то вовремя, он действительно должен заставить фонового рабочего ждать, пока поток пользовательского интерфейса не получит сообщение и не выполнит работу.

    Private ReportProgressWaitEvent As New AutoResetEvent(False)
    Private ReportProgressReadyWaitEvent As New ManualResetEvent(False)
    Private Sub ReportProgress(backgroundWorkerProgressEvents As BackgroundWorkerProgressEventsEnum, userState As Object)
        ReportProgressReadyWaitEvent.Reset()
        _backgroundWorker.ReportProgress(backgroundWorkerProgressEvents, userState)
        WaitHandle.SignalAndWait(ReportProgressReadyWaitEvent, ReportProgressWaitEvent)
    End Sub
    Private Sub _backgroundWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles _backgroundWorker.ProgressChanged
        ... do work ...
        ReportProgressReadyWaitEvent.WaitOne()
        ReportProgressWaitEvent.Set()
    End Sub
0 голосов
/ 06 марта 2012

Вот учебник, как использовать backgroundworker с ProgressBar

Сначала следует вызвать (RunWorkerAsync) , затем backgroundPBar_DoWork начнет выполнять свой код.

backgroundPBar.RunWorkerAsync();
...