c# - 在 C# 中使用 System.ComponentModel.BackgroundWorker 和 lambda 的最佳方式

标签 c# lambda backgroundworker

我想知道最好的方法:

using (var backgroundWorker = new BackgroundWorker())
{
    DoWorkEventHandler doWorkHandler = null;
    doWorkHandler = (s, e) =>
        {
            //Some expensive code goes here...
            backgroundWorker.DoWork -= doWorkHandler;
            //or
            //((BackgroundWorker)s).DoWork -= doWorkHandler;
        };
    backgroundWorker.DoWork += doWorkHandler;

    RunWorkerCompletedEventHandler workerCompleted = null;
    workerCompleted = (s, e) =>
        {
            //Update IU or something...
            backgroundWorker.RunWorkerCompleted -= workerCompleted;
            //or
            //((BackgroundWorker)s).RunWorkerCompleted -= workerCompleted;
        };
    backgroundWorker.RunWorkerCompleted += workerCompleted;

    backgroundWorker.RunWorkerAsync();
}

x

  1. 我想我真的需要删除处理程序以避免泄漏或其他问题。对吧?
  2. 女巫最好,通过“s”参数或通过变量backgroundWorker访问BackgroundWorker实例?是否相同?

最佳答案

无需删除处理程序,除非您在其他地方重复使用相同的 BackgroundWorker 实例。但是,假设您用 Using 围绕它,这应该不是问题(在这种情况下,您的工作人员的范围是 using 语句)。

此外,对 backgroundWorker 实例的访问应该以任何一种方式进行,但是,在循环数据时,我经常喜欢使用 userState 而不是它在 RunWorkerCompletedEventArgs 中返回。

关于c# - 在 C# 中使用 System.ComponentModel.BackgroundWorker 和 lambda 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5184160/

相关文章:

c# - 有向图顶点子集的拓扑排序

c# - 当源对象可能没有给定的属性时如何处理绑定(bind)?

c++ - C++11 lambda 捕获实际捕获了多少?

java - 在 Java 8 中使用 Lambda 从 Map of Maps 生成 Map

c# - 根据 .NET backgroundworker 的结果更新变量

c# - 在没有 WinForm 控件的情况下在主线程上调用一个方法来调用 Invoke 或 BeginInvoke

c# - BackgroundWorker 在 DoWork 之前完成

c# - 查找串行设备 COM 端口

c# - Entity Framework 对于小型企业应用程序来说会不会太过分了?

python - 访问 geoseries 中几何图形中的行