为什么不使用“using”语句呢?这样做几乎没有额外的努力,并且您可以进行处理:
private void PerformLongRunningOperation()
{
using (BackgroundWorker worker = new BackgroundWorker())
{
worker.DoWork += delegate
{
};
worker.RunWorkerAsync();
}
}
编辑:
好的,我做了一个小测试来看看处理和其他方面的情况:
using System;
using System.ComponentModel;
using System.Threading;
namespace BackgroundWorkerTest
{
internal class Program
{
private static BackgroundWorker _privateWorker;
private static void Main()
{
PrintThread("Main");
_privateWorker = new BackgroundWorker();
_privateWorker.DoWork += WorkerDoWork;
_privateWorker.RunWorkerCompleted += WorkerRunWorkerCompleted;
_privateWorker.Disposed += WorkerDisposed;
_privateWorker.RunWorkerAsync();
_privateWorker.Dispose();
_privateWorker = null;
using (var BW = new BackgroundWorker())
{
BW.DoWork += delegate
{
Thread.Sleep(2000);
PrintThread("Using Worker Working");
};
BW.Disposed += delegate { PrintThread("Using Worker Disposed"); };
BW.RunWorkerCompleted += delegate { PrintThread("Using Worker Completed"); };
BW.RunWorkerAsync();
}
Console.ReadLine();
}
private static void WorkerDisposed(object sender, EventArgs e)
{
PrintThread("Private Worker Disposed");
}
private static void WorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
PrintThread("Private Worker Completed");
}
private static void WorkerDoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(2000);
PrintThread("Private Worker Working");
}
private static void PrintThread(string caller)
{
Console.WriteLine("{0} Thread: {1}", caller, Thread.CurrentThread.ManagedThreadId);
}
}
}
以下是输出结果:
Main Thread: 1
Private Worker Disposed Thread: 1
Using Worker Disposed Thread: 1
Private Worker Working Thread: 3
Using Worker Working Thread: 4
Using Worker Completed Thread: 4
Private Worker Completed Thread: 3
经过一些测试,似乎在初始化BackgroundWorker后,Dispose()对其基本上没有影响。无论您是否在using语句的范围内调用它,或者在代码中声明并立即处理和取消引用它,它仍然正常运行。Disposed事件发生在主线程上,而DoWork和RunWorkerCompleted发生在线程池线程上(在事件触发时可用的任何一个)。我尝试了一种情况,在我调用Dispose之后立即取消注册RunWorkerCompleted事件(所以在DoWork有机会完成之前),但RunWorkerCompleted没有触发。这使我相信,尽管已被处理,仍可以操作BackgroundWorker对象。
因此,正如其他人提到的那样,目前看来,调用Dispose不是真正必需的。然而,至少从我的经验和这些测试中,我没有看到任何危害。