代码之家  ›  专栏  ›  技术社区  ›  Grzegorz Smulko

将“func<task>”传递给方法-调用func与lambda与async/await lambda之间有什么区别?

  •  3
  • Grzegorz Smulko  · 技术社区  · 8 年前

    让我们考虑一下方法:

    public static void FireAsyncAndForget(Func<Task> func)
    {
        JoinableTaskFactory.RunAsync(func).FileAndForget();
    }
    
    async Task DoAsync()
    {
        await SomeOtherMethodAsync();
    }
    

    下面的3个例子在代码的执行方式上有什么不同吗?

    1. FireAsyncAndForget(DoAsync);
    2. FireAsyncAndForget(() => DoAsync());
    3. FireAsyncAndForget(async () => await DoAsync());
    1 回复  |  直到 8 年前
        1
  •  1
  •   Shaun Hamman    8 年前

    除非我弄错了,否则这三种方法的执行似乎都是相同的,尽管有细微的差别。

    选项1将直接执行doasync,而其他两个选项则调用本身调用doasync的函数。这将在您的堆栈上创建一个额外的条目。同样的逻辑也适用于选项3,而不是2,有一个额外的等待调用,因此(除非编译器对其进行了优化),我希望它生成一个额外的状态。

    不过,看到这两者之间存在显著的运行时间差异,我希望能够进入微观优化领域。