让我们考虑一下方法:
public static void FireAsyncAndForget(Func<Task> func)
{
JoinableTaskFactory.RunAsync(func).FileAndForget();
}
async Task DoAsync()
{
await SomeOtherMethodAsync();
}
下面3个示例之间的代码执行方式有什么不同吗?
FireAsyncAndForget(DoAsync);
FireAsyncAndForget(() => DoAsync());
FireAsyncAndForget(async () => await DoAsync());
答案 0 :(得分:1)
除非我弄错了,否则所有这三个看起来都会完全相同,尽管存在细微差别。
选项1将直接执行DoAsync,而其他两个调用自己调用DoAsync的函数。这将在您的堆栈上创建一个额外的条目。与2相比,相同的逻辑适用于选项3,还有一个额外的等待调用,因此(除非编译器将其优化掉)我希望它能够生成一个额外的状态。
虽然看到这些之间存在显着的运行时差异,但我希望能够进入微优化领域。