处理BackGroundWorker的正确方法

gal*_*13x 49 .net c# multithreading backgroundworker

这是处理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();
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 70

BackgroundWorker派生自Component.Component实现了IDisposable接口.这反过来使BackgroundWorker继承Dispose()方法.

从Component派生是Windows Forms程序员的便利,他们可以将BGW从工具箱中删除到表单上.一般来说,组件可能有某些东西需要处理.Windows窗体设计器自动处理此问题,在Designer.cs文件中查找"components"字段的Form.它的自动生成的Dispose()方法为所有组件调用Dispose()方法.

但是,BackgroundWorker实际上没有任何需要处理的成员.它不会覆盖Dispose().它的基本实现Component.Dispose()只确保从"components"集合中删除该组件.并提出Disposed事件.但是没有其他任何处理.

长话短说:如果你在表格上放弃一个BGW,那么一切都会自动处理,你无需帮助.如果你没有将它放在表单上,​​那么它不是组件集合中的元素,也不需要做任何事情.

您不必调用Dispose().

  • 我个人喜欢遵循调用`Dispose`的策略,如果在类的实现实际发生变化的情况下存在... (6认同)
  • 我无法与之争辩.但更喜欢一直在思考:"什么样的物体可以由一个需要处理的类包裹?" 看看吧.我编写没有任何意义的代码时遇到了麻烦,并且没有意识到它有一天会有意义.它的工作原理相反:Thread类实际上有一次性对象,但没有实现IDisposable.对每一个他自己. (3认同)

Pau*_*aul 13

在游戏的后期,但我刚遇到了与我的问题相关的情景,我认为我会分享.如果您在类级别创建工作程序并在不关闭应用程序的情况下在连续操作中重复使用它,如果在完成后不删除事件,则它们将在每次连续执行时递增并运行多次.

worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
Run Code Online (Sandbox Code Playgroud)

没有上面我的DoWork第一次发射,第二次发射两次,等等.对于大多数人来说,这可能是一个明智的选择,但是我花了一些时间来解决它,所以希望这会帮助其他人.