将`Func <task>`传递给方法 - 调用func与lambda与async / await lambda之间的任何差异?

时间:2018-05-29 18:12:57

标签: c# async-await

让我们考虑一下方法:

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 个答案:

答案 0 :(得分:1)

除非我弄错了,否则所有这三个看起来都会完全相同,尽管存在细微差别。

选项1将直接执行DoAsync,而其他两个调用自己调用DoAsync的函数。这将在您的堆栈上创建一个额外的条目。与2相比,相同的逻辑适用于选项3,还有一个额外的等待调用,因此(除非编译器将其优化掉)我希望它能够生成一个额外的状态。

虽然看到这些之间存在显着的运行时差异,但我希望能够进入微优化领域。