【发布时间】:2010-03-30 01:36:09
【问题描述】:
这是处置 BackGroundWorker 的正确方法吗?我不确定在调用 .Dispose() 之前是否需要删除事件。在 RunWorkerCompleted 委托中调用 .Dispose() 也可以吗?
public void RunProcessAsync(DateTime dumpDate)
{
BackgroundWorker worker = new BackgroundWorker();
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync(dumpDate);
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
// Do Work here
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
worker.Dispose();
}
【问题讨论】:
-
这是表单的后台工作人员吗?
-
是的,尽管我以编程方式创建了 BGW,而不是将其放在设计器中的表单上。如图所示,当我想运行线程时会创建 BGW。这个想法是在每次调用线程时创建一个不同的 BGW,并在它们完成时处理它们。
-
我知道这是 aaaaaaaages 以前的事情,它是注册处理程序的旧方式,但是,这个:-= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted) 正在创建一个包装 worker_RunWorkerCompleted 的新委托,所以它不是与第一个实例相同的委托,并且第一个仍将挂起,附加到后台工作人员。要确保删除处理程序,请使用:+= worker_RunWorkerCompleted 和 -= worker_RunWorkerCompleted(不使用“新 xxxEventHandler”包装器。
标签: c# .net multithreading backgroundworker