BackgroundWorker с анонимными методами? - PullRequest
26 голосов
/ 16 января 2010

Я собираюсь создать BackgroundWorker с анонимным методом.
Я написал следующий код:

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


Но Делегат 'System.ComponentModel.DoWorkEventHandler' не принимает аргументы '0' , и мне нужно передать два объекта анонимному методу: отправитель объекта, DoWorkEventArgs е

Не могли бы вы наставить меня, как я могу это сделать? Спасибо.

Ответы [ 4 ]

51 голосов
/ 16 января 2010

Вам просто нужно добавить параметры в анонимную функцию:

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

Или, если вас не интересуют параметры, вы можете просто:

bgw.DoWork += delegate { ... }
30 голосов
/ 16 января 2010

Если вы указываете лямбду, вы должны убедиться, что она принимает то же количество аргументов:

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

Но если вы не используете аргументы, вы можете просто использовать анонимный делегат без параметров:

bgw.DoWork += delegate
{
    ...
};
4 голосов
/ 16 января 2010

Если бы вы написали выше без лямбд, как это было бы?

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);
    }

Но теперь вы используете лямбды без привязанных переменных () => Вы должны предоставить два объекта sender и e (которые они получат в качестве типа позже).

backgroundWorker1.DoWork += (sender, e) => ...
3 голосов
/ 18 апреля 2014

Позволяет упростить процесс

Лямбда-выражения действительно удобны, чтобы сделать код короче и более читабельным. Однако программисты начального уровня могут столкнуться с некоторыми трудностями. Есть три отдельных понятия, которые нужно пройти: анонимные методы, делегаты и лямбда-выражения. Подробное описание каждого из них выходит за рамки этого ответа. Я надеюсь, что приведенный ниже пример кода послужит цели краткого обзора различных доступных подходов.

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;
    }
}

Обратите внимание, что в этом примере мы использовали «делегат», а не «делегат» (между ними есть разница)

...