在C#中将Lambda与System.ComponentModel.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

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

解决方法:

1)你到底是什么意思?要删除“ doWorkHandler”?
如果是这样,就您不需要(据我所知).
正如Ale所说,您只需要重用相同的bgw.

但是对于使用而言,我不会那样做.
这只是我的实现方式,但对于bgw,我会坚持使用类中包含的变量.

2)两种访问方式都可以正常工作(常规使用).使用“ s”是“更好”的选择,但是您必须对所有内容进行类型转换,因此代码将变得更难阅读.
我个人将使用变量声明代替(直接访问)代替“ s”对象.

现在,有一些新东西.
看一下Task库.
可能是一个行之有效的方法(我发现它比使用Background Worker更好和更容易).
您还可以构建并行任务=)

上一篇:如何创建自动上传Android图片应用程序?


下一篇:java-后台工作者的Spring Boot应用程序