Почему я получаю TargetInvocationException с BackgroundWorker.ReportProgress? - PullRequest
3 голосов
/ 22 ноября 2011

Я работаю над проектом на C #, где у меня есть Backgroundworker, который выполняет мою "дорогую работу".

В моем «DoWork» я хочу сообщить о прогрессе с помощью «backgroundworker.ReportProgress (some int)». Но когда моя программа приходит к вызову «backgroundworker.ReportProgress (some int)», я получаю «System.Reflection.TargetInvocationException».

Как мне исправить мою проблему?

private void btnGrap_Click(object sender, EventArgs e)
    {
        //some code
        ListsObject listsObject = new ListsObject(filePaths, enumList);
        progressBar1.Maximum = 100;//count;
        this.bgrndWorkerSearchMatches.RunWorkerAsync(listsObject);
     }

_DoWork:

private void backgroundWorkerSearchMatches_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            bgrndWorkerSearchMatches.ReportProgress(i);
        }
     }

_ProcessChanged:

private void bgrndWorkerSearchMatches_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        //progressBar1.Value = e.ProgressPercentage;
    }
<Ч />

Я нашел ответ:

Я создал обработчик событий backgroundworker с помощью Visual Studio и не знал, что мне нужно установить вручную:

bgrndWorkerSearchMatches.WorkerReportsProgress = true;

Ответы [ 3 ]

9 голосов
/ 22 ноября 2011

A TargetInvocationException выбрасывается, чтобы обернуть другое исключение, которое было сгенерировано методом, который в конечном итоге был вызван.

Проверьте InnerException, чтобы узнать, что произошло.

2 голосов
/ 23 ноября 2011

НАЙДЕН ответ:

Я создал обработчик событий фонового рабочего с Visual Studio и не знал, что мне нужно установить вручную:

bgrndWorkerSearchMatches.WorkerReportsProgress = true;

в любом случае, большое спасибо, ребята

1 голос
/ 22 ноября 2011

Вы не говорите, что на самом деле делает этот ReportProgress (), но вам нужно вызвать команду.

Я думаю, это будет что-то вроде:

private void ReportProgress(int percentage)
{
  this.SetProgressBar(percentage);
}

затем в «родительском» коде, который устанавливает рабочий поток:

delegate void SetProgressBarCallback(int percentage);
public void SetProgressBar(int percentage)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.progressBar1.InvokeRequired)
            {   
                SetProgressBarCallback d = new SetProgressBarCallback(SetProgressBar);
                this.Invoke(d, new object[] { percentage});
            }
            else
            {
                this.progressBar1.value = precentage;
            }
        }

Посмотрите здесь пример использования WinForms.

...