BackgroundWorker дает проблему в C # при добавлении элемента в список? - PullRequest
0 голосов
/ 23 июня 2009

У меня есть список, в котором я должен дать как минимум 2 файла для слияния. слияние завершается, когда я нажимаю кнопку «Объединить». Запускается индикатор выполнения и появляется окно сообщения о том, что файлы были объединены. Я использую фоновый рабочий для запуска индикатора выполнения.

Теперь проблема в том, что когда объединение завершено с 2 файлами, я добавляю еще один файл, нажимаю кнопку объединения, появляется сообщение об объединении, я нажимаю кнопку ОК в окне сообщения, снова появляется окно сообщения с тем же сообщением, которое имеет Готово. Это окно сообщения продолжает отображаться, сколько раз я добавляю файл в список.

Например, для 2 файлов появляется сообщение 1ce den при добавлении еще 1 файла появляется сообщение 2ice, появляется еще 1 файл в списке сообщений 3ic. Как и в случае его продолжения ....

Когда я использовал отладчик, чтобы отследить его, я заметил, что мое событие Background Worker Runcompleted вызывается столько раз, когда я добавляю файл в список. Вот код события слияния кнопки Click ...

Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted +=
    new  RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
Worker.WorkerSupportsCancellation = true;

if (!Worker.IsBusy)
    Worker.RunWorkerAsync();
else
    MessageBox.Show("Cannot run background worker twice ");

if (Worker.IsBusy)
{
    progress = new ProgressDialogDTB();
    progress.FormClosing += 
        new FormClosingEventHandler(ProgressDialog_FormClosing);
    progress.ShowDialog(this);
}
while (Worker.IsBusy)
{
    Application.DoEvents();
}

//For Background Worker completed Event...
private void Worker_RunWorkerCompleted(object sender, 
    AsyncCompletedEventArgs e)
{            
    if (progress != null)
    {
        progress.Close();
        progress = null;
    }
    if ( e.Cancelled )
        MessageBox.Show(" Progress was cancelled ");                               

    if (e.Error == null)
        if (!e.Cancelled)
            MessageBox.Show("Files has been merged ");

    if (e.Error != null)
        MessageBox.Show(e.Error.Message);     
}//Worker_RunWorkerCompleted

Я не знаю, где я ошибаюсь. Пожалуйста, помогите ... Спасибо ...

Ответы [ 2 ]

3 голосов
/ 23 июня 2009

Я предполагаю, что при каждом нажатии кнопки Merge вы регистрируете нового делегата. Если следующий код:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new  System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

в обработчике события click кнопки Merge рассмотрите возможность его перемещения в метод инициализации формы. Вам нужно зарегистрировать делегата только один раз. В следующий раз вы добавите новый, чтобы при втором щелчке Merge он запускался дважды, при третьем щелчке три раза и т. Д.

2 голосов
/ 23 июня 2009

Если ваш работник является переменной уровня модуля и вы добавляете ее в список вызовов каждый раз, когда нажимаете кнопку, этот метод будет вызываться каждый раз. Допустим, вы нажимаете 3 раза, тогда этот код Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); будет выполнен 3 раза и будет вызван 3 раза. Установите обработчик Completed один раз при создании экземпляра рабочего объекта.

Ба! Избит до этого!

...