使用匿名方法的BackgroundWorker?

28

我将创建一个带有匿名方法的BackgroundWorker
我编写了以下代码:

BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(
    () =>
    {
        int i = 0;
        foreach (var item in query2)
        {
            ....
            ....
        }
    }
);

但是'System.ComponentModel.DoWorkEventHandler'委托不接受0个参数,而我必须将两个对象传递给匿名方法:object sender, DoWorkEventArgs e

请问您能指导我如何解决吗?谢谢。

4个回答

57

你只需要向匿名函数添加参数:

bgw.DoWork += (sender, e) => { ... }

或者如果您不关心参数,您可以这样做:

bgw.DoWork += delegate { ... }

@Jader:我已经编辑过了,使其与我的答案相同。为什么不直接给我的答案点赞呢? - Kent Boogaart

33

如果你指定了一个 lambda 函数,你必须确保它接受相同数量的参数:

bgw.DoWork += (s, e) => ...;

但是如果您不使用参数,可以使用没有参数的匿名委托:

bgw.DoWork += delegate
{
    ...
};

@Offler:如果你使用了lambda或匿名委托,就不能使用“-=”。你可以先将其捕获到一个本地变量中,然后在“+=”和“-=”中都使用它。 - Kent Boogaart

4
如果没有使用lambda表达式,那么上述代码会是怎样的呢?
backgroundWorker1.DoWork += 
                new DoWorkEventHandler(backgroundWorker1_DoWork);

以及命名的方法:

private void backgroundWorker1_DoWork(object sender, 
        DoWorkEventArgs e)
    {   
        // Get the BackgroundWorker that raised this event.
        BackgroundWorker worker = sender as BackgroundWorker;

        // Assign the result of the computation
        // to the Result property of the DoWorkEventArgs
        // object. This is will be available to the 
        // RunWorkerCompleted eventhandler.
        e.Result = ComputeFibonacci((int)e.Argument, worker, e);
    }

但现在你正在使用没有绑定变量的 lambda ()=>。你应该提供两个对象 sender 和 e(它们将在稍后得到类型推断)。

backgroundWorker1.DoWork += (sender, e) => ...

4

让它变简单

Lambda表达式非常有用,可以使代码更短、更易读。然而初级程序员可能会觉得有些难以处理。需要了解三个概念:匿名方法、委托和Lambda表达式。对每个概念进行详细的解释超出了本答案的范围。希望下面给出的代码示例能够快速介绍不同的方法。

class TestBed
{
    BackgroundWorker bgw = new BackgroundWorker();
    void sample()
    {            
        //approach #1
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        //DoWorkEventHandler is nothing but a readily available delegate written by smart Microsoft guys

        //approach #2, to make it a little shorter
        bgw.DoWork += (s,e) => 
        {
            //...
        };
        //this is called lambda expression (see the => symbol)

        //approach #3, if lambda scares you
        bgw.DoWork += delegate 
        { 
            //... (but you can't have parameters in this approach
        };

        //approach #4, have a helper method to prepare the background worker
        prepareBgw((s,e)=>
        {
            //...
        }
        );

        //approach #5, helper along with a simple delegate, but no params possible
        prepareBgw(delegate 
        {
            //...
        }
        );

        //approach #6, helper along with passing the methodname as a delegate
        prepareBgw(bgw_DoWork);

        //approach #7, helper method applied on approach #1
        prepareBgw(new DoWorkEventHandler(bgw_DoWork));

    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        //...
    }
    void prepareBgw(DoWorkEventHandler doWork)
    {
        bgw.DoWork+= doWork;
    }
}

请注意,在本例中我们使用的是“delegate”而不是“Delegate”(两者之间有区别)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接