我在这里和这里研究了异步和等待语法。它确实有助于理解用法,但我在 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:如果sender
和e
这两个参数没有出现在HandleTimer
方法中,它们有什么用?
它将异步 lambda 分配给 timer
的Elapsed
事件。您可以这样理解异步 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();
}
似乎是λ绊倒了你。