请解释计时器事件异步/等待语法



我在这里和这里研究了异步和等待语法。它确实有助于理解用法,但我在 MSDN 上发现了一个有趣的语法示例,我只是不明白。

问题:有人可以向我解释一下这个System.Timers.Timer事件注册的语法,等待着异步:为什么您可以使用 lambda 表达式中已有的 async await 关键字?

Timer timer = new Timer(1000);
timer.Elapsed += async ( sender, e ) => await HandleTimer();
private Task HandleTimer()
{
    Console.WriteLine("nHandler not implemented..." );        
}

问题2:如果sendere这两个参数没有出现在HandleTimer方法中,它们有什么用?

它将异步 lambda 分配给 timerElapsed事件。您可以这样理解异步 lambda:首先,下面是一个 lambda:

(sender, e) => HandleTimer()

此 lambda 同步调用HandleTimer。然后我们添加一个 await 来异步调用HandleTimer

(sender, e) => await HandleTimer()

但这行不通,因为要异步调用某些东西,您必须自己异步,因此async关键字:

async (sender, e) => await HandleTimer()

这只是一个异步 lambda 表达式。它相当于:

timer.Elapsed = CallHandleTimer;
async void CallHandleTimer(object sender, EventArgs e)
{
    await HandleTimer();
}
<</div> div class="one_answers">

您给出的代码是一个作为 lambda 表达式编写的匿名函数。

因此,真正发生的是,对于计时器经过的事件,您将事件处理程序分配为async ( sender, e ) => await HandleTimer();

翻译为类似的东西

timer.Elapsed += AnonFunc;
async void AnonFunc(object sender, EventArgs e)
{
    await HandleTImer();
}

似乎是λ绊倒了你。

最新更新