我研究了asynch并等待语法here和here。理解其用法确实很有帮助,但我在MSDN找到了一个有趣的语法示例,我不理解。
问题:
有人可以向我解释这个System.Timers.Timer
事件注册的语法与asynch等待:
为什么可以使用lambda表达式中已有的async
await
个关键字?
Timer timer = new Timer(1000);
timer.Elapsed += async ( sender, e ) => await HandleTimer();
private Task HandleTimer()
{
Console.WriteLine("\nHandler not implemented..." );
}
问题2:
什么是两个参数sender
&如果他们没有出现在e
方法中,那么HandleTimer
会有好处吗?
答案 0 :(得分:8)
它为Elapsed
timer
事件指定了一个异步lambda。您可以通过这种方式理解异步lambda:首先,以下是lambda:
(sender, e) => HandleTimer()
这个lambda同步调用HandleTimer
。然后我们添加await以异步方式调用HandleTimer
:
(sender, e) => await HandleTimer()
但这不起作用,因为要异步调用某些东西,你必须自己是异步的,因此async
关键字:
async (sender, e) => await HandleTimer()
答案 1 :(得分:2)
这只是一个异步lambda expression。它相当于:
timer.Elapsed = CallHandleTimer;
async void CallHandleTimer(object sender, EventArgs e)
{
await HandleTimer();
}
答案 2 :(得分:2)
您提供的代码是一个写为lambda表达式的匿名函数。
所以真正发生的事情是,对于计时器已过去的事件,您将EventHandler指定为async ( sender, e ) => await HandleTimer();
。
转换为类似
的内容timer.Elapsed += AnonFunc;
async void AnonFunc(object sender, EventArgs e)
{
await HandleTImer();
}
看来它是骚扰你的lambda。