1

我在这里阅读了一些关于使用委托的基础知识

我在 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();
        }
    } 
4

1 回答 1

0

MethodInvoker只是一个预定义的委托,它不带参数并返回void

public delegate void MethodInvoker()

您可以完全自由地创建自己的委托,就像您链接到的示例一样:

private delegate void MyDelegate();

并替换MethodInvokerMyDelegate.

在您的代码中,创建了一个匿名方法。匿名方法的优点是它可以访问在myTimer_Elapsed. 由于elapsedTime并且elapsedCounter似乎是在外部声明的,因此您可以将其替换为显式定义的方法,如下所示:

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        
    {       
        ...
    }       
}        
于 2012-05-03T07:24:41.007 回答