后台工作人员';s的RunWorkerCompleted事件甚至在完成工作之前就已启动
本文关键字:工作 启动 工作人员 事件 RunWorkerCompleted 后台 | 更新日期: 2023-09-27 18:25:17
我正在使用BackgroundWorker线程执行一项长任务(基本上是读取一个大的xml文件)。这是第一次工作人员按要求正常工作,但如果我上传第二个xml文件,使用同一个后台工作人员,它有时工作得很好,但大多数情况下,Backgroundworker的RunWorkerCompleted甚至在DoWork事件之前就被激发了。部分代码显示在下方
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是一个全局定义的变量。我不明白这里出了什么问题。请帮助
您应该在调用RunWorkerAsync()
之前添加DoWork
-事件处理程序(以及所有其他事件处理程序)。
否则,可能发生RunWorkerAsync
实际上什么都不做的情况。
应该是这样的:
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();
应该在订阅DoWork
和RunWokerCompleted
事件之后调用RunWorkerAsync
。
您应该首先检查后台工作人员是否繁忙,使用这个。。。。
backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
}
else
{
backgroundWorker1.RunWorkerAsync();
}
如中所述https://stackoverflow.com/a/16809596/8029935,当DoWork方法因异常而死亡时,您可以盲目地假设工作人员已经完成了工作并产生了结果。它被BackgroundWorker捕获,并作为e.Error属性传递给RunWorkerCompleted事件处理程序。
因此,我建议您必须使用try/catch语句检查该属性。
如果在BackgroundWorker_DoWork事件中调用另一个异步函数,
喜欢;
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
somethingsToDoAsync();
// somethingsToDoAsync() function is to ASYNC
}
_RunWorkerCompleted甚至在完成_Dowork事件之前就触发了。
将另一个函数更改为非异步。