2013-07-29 1 views
2

Я использую поток BackgroundWorker для выполнения длинной задачи (в основном, чтение большого XML-файла). В первый раз работник работает отлично по своему желанию, но если я загружу второй файл xml, используя тот же фоновый рабочий, он отлично работает, но большую часть времени RunWorkerCompleted Backgroundworker запускается даже до события DoWork. Некоторая часть кода отображается нижеСобытие RunWorker рабочего стола завершено даже до завершения работы

private void openFile_Click(object sender, RoutedEventArgs e) 
    { 
      // Code removed for brevity 
    worker = new BackgroundWorker(); 
      worker.RunWorkerAsync(); 
      worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
      worker.WorkerReportsProgress = true; 
      worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
     } 

     void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     DataImport(); 
     //worker.Dispose(); 
     //worker.Disposed += new EventHandler(worker_Disposed); 
     //worker.DoWork -= worker_DoWork; 
     //worker.RunWorkerCompleted -= worker_RunWorkerCompleted; 
     //worker = null; 
     //GC.Collect(GC.GetGeneration(worker), GCCollectionMode.Forced); 
    } 

рабочий является глобально определенной переменной. Что здесь не так, я не получаю. Пожалуйста, помогите

+0

Несколько советов для Выполнил: Не называйте 'GC.Collect () ', Проверьте' e.Error'. –

+1

Невозможно ответить, не видя хотя бы схему DoWork(). –

+0

Если ваша функция DoWork создает поток для выполнения своей работы, и вы не выполняете .Join(), DoWork немедленно вернется. Но, как сказал @Henk, нужно посмотреть, что делает DoWork. – bland

ответ

9

Вы должны добавить DoWork -Event обработчик (и все другие обработчик события, тоже) перед тем вызова RunWorkerAsync().

В противном случае могло случиться так, что RunWorkerAsync практически ничего не делает.

+1

Правда, но на самом деле не объясняет, что симптомы «увольняются еще до события DoWork». –

+0

Могу также упомянуть, так как он повторно использует рабочего, чтобы он не добавлял обработчики событий несколько раз. –

+0

@JimMischel Кроме того, он повторно использует обработчики событий, поэтому, возможно, событие «RunWorkerCompleted», которое уволено, не относится к «текущему» фоновому работнику. – sloth

2

Это должно быть так:

worker = new BackgroundWorker(); 
worker.WorkerReportsProgress = true; 

worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.ProgressChanged += 
    new ProgressChangedEventHandler(worker_ProgressChanged); 
worker.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 

worker.RunWorkerAsync(); 

RunWorkerAsync должна вызываться после подписки на DoWork и RunWokerCompleted событий.

2

вы должны проверить, что первый рабочий фон занят или нет, используя это ....

 backgroundWorker1.DoWork += backgroundWorker1_DoWork; 
     backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; 
 if (backgroundWorker1.IsBusy) 
     { 
      backgroundWorker1.CancelAsync(); 
     } 
     else 
     { 
      backgroundWorker1.RunWorkerAsync(); 

     } 
Смежные вопросы