2013-07-29 37 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(); 

     } 
相关问题