2013-07-29 35 views
2

我正在使用BackgroundWorker線程執行一項長時間任務(基本上讀取一個大的xml文件)。這是工作人員第一次按需要正常工作,但如果我上傳第二個xml文件,使用相同的後臺工作程序,它有時可以正常工作,但大部分時間BackgroundWorker的RunWorkerCompleted甚至在DoWork事件之前被解僱。部分代碼顯示如下Backgroundworker的RunWorkerCompleted事件甚至在完成工作之前就被觸發

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); 
    } 

worker是一個全局定義的變量。這裏有什麼不對,我沒有得到。好心幫

+0

用於完成一些提示:不要叫'所以GC.Collect( )',檢查'e.Error'。 –

+1

無法回答,至少沒有看到DoWork()的大綱。 –

+0

如果您的DoWork函數產生一個線程來執行其工作,並且您不執行.Join(),DoWork將立即返回。但正如@亨克所說,需要了解DoWork的功能。 – bland

回答

9

你應該調用RunWorkerAsync()前添加DoWork -event處理程序(和所有其他的事件處理程序,太)

否則,可能發生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應訂閱到DoWorkRunWokerCompleted事件後調用。

2

,你應該首先檢查後臺工作忙或沒有,用這個....

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

     } 
相關問題