2010-01-16 71 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:編輯,以便它是我的回答是等價的。爲什麼不直接投我的答案? – 2010-01-16 18:05:17

30

如果指定拉姆達你必須確保它需要相同數量的參數:

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

但是,如果您不使用參數, t使用不帶參數的匿名代理:

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

我不知道你會做什麼惠特「 - =」... – Offler 2013-03-25 15:20:45

+0

@Offler:如果你使用了lambda或匿名委託,你不能使用' - ='。你可以首先在局部變量中捕獲它,並在'+ ='和' - ='中使用它。 – 2013-03-25 20:16:51

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) => ... 
2

讓使簡單

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

注(在這兩個之間的差異)