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

3

让我们考虑一些方法:

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());

3
我不知道你所说的“任何差异”的意思。让我们来探究一下。这里有三个“待办事项”清单:(1)“制作三明治”,(2)“制作一个待办事项清单,上面写着‘制作三明治’,然后做清单上的事情”,(3)“制作一个待办事项清单,上面写着‘制作一个待办事项清单,上面写着(制作三明治),然后做清单上的事情’,然后做清单上的事情”。这些待办事项清单在执行时是否有任何不同?它们最终都会得到一个三明治。如果答案是肯定的,那么你的问题的答案也是肯定的。 - Eric Lippert
@EricLippert 如果你的名字恰好是三明治,而你正忙于在酒吧赌博或周末参加钓鱼派对,那么还缺少一层委托,你可以“下令制作三明治并把它送到我这里”。 - samus
1个回答

1

除非我错了,这三个选项看起来执行的效果都是相同的,但是存在微妙的差别。

选项1将直接执行DoAsync,而其他两个选项调用一个函数,该函数本身调用DoAsync。这将在您的堆栈上创建额外的条目。与选项2相比,选项3也适用于相同的逻辑,存在额外的await调用,因此(除非编译器优化掉它),我会期望它生成一个额外的状态。

尽管在这些选项之间看到了明显的运行时间差异,但我希望它处于微观优化的范畴内。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接