2012-05-03 72 views
1

我讀了一些基本的使用委託here使用委託

上我貼在SO一個問題,下面的代碼是答案的一部分。

此語法是否可以轉換爲語法,更類似於MSDN文章,其中明確聲明瞭委託等等,或者在某些情況下,這是編碼它的唯一方法嗎?

我要找的編碼它的另一種方式的原因是,作爲一個新手到C#我找到這一行很難讓我的頭周圍this.BeginInvoke(new MethodInvoker(delegate

private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){ 

     elapsedCounter++; 
     elapsedTime = DateTime.Now.Subtract(startTime); 

     if (elapsedTime.TotalMilliseconds < MaxTime) 
     { 
      this.BeginInvoke(new MethodInvoker(delegate 
      { 
       this.lblElapsedTime.Text = elapsedTime.ToString(); 

       if (elapsedCounter % 2 == 0) 
        this.lblValue.Text = EvenText; 
       else 
        this.lblValue.Text = OddText; 
      })); 
     } 
     else 
     { 
      myTimer.Stop(); 
      myTimer.Dispose(); 
      //myProcess.Close(); 
     } 
    } 
+2

的是..這不* *明確聲明一個代理...?你在尋找什麼樣的替代語法? –

+0

woops! +1爲你的外交Marc。 MSDN文章中的語法似乎更加明確,便於我掌握正在發生的事情。我認爲'this.BeginInvoke(新的MethodInvoker(委託)做了很多,所以我希望替代方案將它分解成更多的代碼行,這樣我就可以看到它正在發生。 – whytheq

回答

0

MethodInvoker只是一個預定義的委託這需要沒有任何參數和返回void

public delegate void MethodInvoker() 

你是完全免費的,而不是創建自己的代表,就像在例子中,你鏈接到:

private delegate void MyDelegate(); 

並且用MyDelegate替換MethodInvoker

在您的代碼中,創建了一個anonymous method。匿名方法的優點是它可以訪問在myTimer_Elapsed中聲明的局部變量。由於elapsedTimeelapsedCounter似乎外界宣佈,你可以用一個明確定義的方法如下替換此:

private void MyMethod() { 
    this.lblElapsedTime.Text = elapsedTime.ToString();  

    if (elapsedCounter % 2 == 0)  
     this.lblValue.Text = EvenText;  
    else  
     this.lblValue.Text = OddText;  
} 

private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){  
    ... 

    if (elapsedTime.TotalMilliseconds < MaxTime)  
    { 
     MyDelegate delegateToMyMethod = MyMethod; 
     this.BeginInvoke(delegateToMyMethod);  
    }  
    else   
    {  
     ... 
    }  
}