处理BackGroundWorker的正确方法
这将是一个正确的方式来处置BackGroundWorker? 我不确定在调用.Dispose()之前是否需要删除事件。 也是调用.Dispose()里面的RunWorkerCompleted委托可以做?
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(); }
BackgroundWorker派生自Component。 组件实现了IDisposable接口。 这反过来使BackgroundWorkerinheritance了Dispose()方法。
从Component派生是Windows Forms程序员的一个方便,他们可以将BGW从工具箱拖放到表单上。 一般来说组件可能有些东西需要处理。 Windows窗体devise器会自动执行此操作,请在Designer.cs文件中查找“组件”字段的窗体。 其自动生成的Dispose()方法为所有组件调用Dispose()方法。
但是,BackgroundWorker实际上并没有任何需要处理的成员。 它不重写Dispose()。 其基本实现Component.Dispose()仅确保将组件从“组件”集合中删除。 并提出Disposed事件。 但是不要处理任何东西。
长话短说:如果你在表单上放了一个BGW,那么所有的东西都会自动处理,你不需要帮忙。 如果你没有把它放在表单上,那么它就不是元素集合中的一个元素,也不需要做任何事情。
您不必调用Dispose() 。
在游戏后期,但我碰到了一个与我想分享的问题有关的场景。 如果您在课堂级别创build工作人员并在不closures应用程序的情况下在连续的操作上重复使用它,如果您在完成后不删除事件,则会在每次连续执行时递增并运行多次。
worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
如果没有上述情况,我的DoWork第一次,第二次两次,等等。这可能是大多数人不用理睬的,但是我花了一点时间才弄明白,所以希望这会帮助别人。
worker.Dispose()
不是必需的,因为Dispose()
是自动调用的。 但在处理对象之前,您需要删除所有事件处理程序。
这篇文章告诉我们这个。
worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandle(worker_RunWorkerCompleted); worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
是的,这看起来是正确的。 当然,一次性物品更好地using
块来处理,但是在这里你没有这个选项。
我通常用表单生命周期创build我的背景,重用它们,让devise器代码在forms上处理。 less思考。
如果它位于“WinForms”表单上,请让容器处理它(请参阅Form.Designer.xyz文件中生成的Dispose
代码)
在实践中,我发现你可能需要创build容器的实例,并添加工人(或其他companent),如果有人知道更正式的方式来这样大喊!
PK 🙂
public partial class Form1 : Form { public Form1() { InitializeComponent(); // watch the disposed event.... backgroundWorker1.Disposed += new EventHandler(backgroundWorker1_Disposed); // try with and without the following lines components = new Container(); components.Add(backgroundWorker1); } void backgroundWorker1_Disposed(object sender, EventArgs e) { Debug.WriteLine("backgroundWorker1_Disposed"); } //... from the Designer.xyz file ... /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } }