2010-01-16 2 views
25

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

BackgroundWorker с анонимными методами?

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


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

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

ответ

48

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

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

Или, если вы не заботитесь о параметрах вы можете просто:

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

@Jader: Под ред так, что это эквивалент моего ответа. Почему бы просто не проголосовать за мой ответ? –

30

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

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

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

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

Интересно, что бы вы сделали whit "- =" ... – Offler

+0

@Offler: если вы использовали лямбда или анонимный делегат, вы не можете использовать '- ='. Вместо этого вы можете перенести его сначала в локальную переменную и использовать ее как в '+ =', так и '- ='. –

4

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

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

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

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

позволяет сделать это просто

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

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

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

Смежные вопросы