使用委托
问题描述:
上我贴在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();
}
}
答
MethodInvoker
只是一个预定义的委托这需要没有任何参数和返回void
:
public delegate void MethodInvoker()
你是完全免费的,而不是创建自己的代表,就像在例子中,你链接到:
private delegate void MyDelegate();
并且用MyDelegate
替换MethodInvoker
。
在您的代码中,创建了一个anonymous method。匿名方法的优点是它可以访问在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
{
...
}
}
的是..这不* *明确声明一个代理...?你在寻找什么样的替代语法? –
woops! +1为你的外交Marc。 MSDN文章中的语法似乎更加明确,便于我掌握正在发生的事情。我认为'this.BeginInvoke(新的MethodInvoker(委托)做了很多,所以我希望替代方案将它分解成更多的代码行,这样我就可以看到它正在发生。 – whytheq