请解释Timer事件async / await语法

时间:2016-06-07 12:31:33

标签: c# events asynchronous timer async-await

我研究了asynch并等待语法herehere。理解其用法确实很有帮助,但我在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会有好处吗?

3 个答案:

答案 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。