【问题标题】:Please explain Timer event async/await syntax请解释定时器事件异步/等待语法
【发布时间】:2016-06-07 12:31:32
【问题描述】:

我研究了 asynch 和 await 语法 here 和 here。它确实有助于理解用法,但我在 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: 如果HandleTimer方法中没有出现sender和e这两个参数有什么用?

【问题讨论】:

  • 它只是一个使用 lambda 语法声明的匿名方法。它也恰好是异步的。你对哪一部分感到困惑?
  • 我认为 lambda 语法让我感到困惑
  • 人们能否解释一下反对票以避免将来发生这种情况?
  • 人们喜欢很快就加入赞成/反对票。不过,我以后会说,试着解释一下你不明白的确切。字面意思是表达式的哪一部分。

标签: c# events asynchronous timer async-await


【解决方案1】:

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

(sender, e) => HandleTimer()

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

(sender, e) => await HandleTimer()

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

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

【讨论】:

  • 这是一个很好的解释。现在我明白了,sender和e这两个参数是HandleTimer方法的输入参数。
  • @MongZhu async (sender, e) => await HandleTimer(sender, e)
  • 好吧,实际上看起来很全面。这意味着如果HandleTimer 没有参数,那么事件只能在类内触发,对吗?
【解决方案2】:

这只是一个异步lambda expression。相当于:

timer.Elapsed = CallHandleTimer;

async void CallHandleTimer(object sender, EventArgs e)
{
    await HandleTimer();
}

【讨论】:

    【解决方案3】:

    你给出的代码是一个匿名函数,写成 lambda 表达式。

    所以真正发生的是,对于计时器已用事件,您将 EventHandler 分配为async ( sender, e ) => await HandleTimer();。

    翻译成类似的东西

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

    似乎是 lambda 让你绊倒了。

    【讨论】:

    • 是的,我不知道有人可以在 lambda 行中使用这些关键字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2011-10-04
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多