c# - 处理 BackGroundWorker 的正确方法

标签 c# .net multithreading backgroundworker

这是处理 BackGroundWorker 的正确方法吗?我不确定在调用 .Dispose() 之前是否需要删除事件。在 RunWorkerCompleted 委托(delegate)中调用 .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();
}

最佳答案

BackgroundWorker 派生自 Component。组件实现 IDisposable 接口(interface)。这反过来又使 BackgroundWorker 继承了 Dispose() 方法。

从组件派生对于 Windows 窗体程序员来说很方便,他们可以将 BGW 从工具箱放到窗体上。一般而言,组件在某种程度上可能需要处理一些东西。 Windows 窗体设计器会自动处理此问题,在 Designer.cs 文件中查找“组件”字段的窗体。它自动生成的 Dispose() 方法为所有组件调用 Dispose() 方法。

然而,BackgroundWorker 实际上并没有任何需要释放的成员。它不会覆盖 Dispose()。它的基本实现 Component.Dispose() 仅确保从“组件”集合中删除该组件。并引发 Disposed 事件。但不会以其他方式处置任何东西。

长话短说:如果您将 BGW 放在表单上,​​那么一切都会自动处理,您无需提供帮助。如果您没有将它放在表单上,​​那么它就不是组件集合中的元素,无需执行任何操作。

您不必调用 Dispose()

关于c# - 处理 BackGroundWorker 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542326/

相关文章:

c# - 此命名空间冲突是由于 XAML 到 .NET 代码生成中的错误造成的吗?

c# - 将毫秒转换为人类可读的时间流逝

c# - 如何使用控件(例如按钮)从表单调用事件?

.net - 仔细检查 - 拥有内部 View 模型类是否有意义?

java - Java中哪个线程负责什么

c# - 团结 : Why can't I automatically select my input field?

c# - IServiceCollection 不包含定义 AddJsEngineSwitcher

c# - 当您发现重复的文件名时,是否有一种简单的方法可以将 (#) 添加到文件名中?

php - php 中是否有类似 Java 的线程概念?

c++ - 如何保证两个线程中的两个类写同一个变量线程安全?