.net 在lambda表达式中使用async和wait?

.net 在lambda表达式中使用async和wait?,.net,asynchronous,lambda,.net,Asynchronous,Lambda,我有以下方法: private async Task<T> GetStuff<T>() {} private async Task<T> DoStuff<T>(int id, Func<Task<T>> func) {} 这里的区别在于是否在lambda输入参数处设置async关键字,以及在表达式体调用其他异步方法时设置await 就我所知,选项1和选项2似乎都很好,这让我觉得选项2只是多余的,或者可能是有害的 - 编辑:

我有以下方法:

private async Task<T> GetStuff<T>() {}
private async Task<T> DoStuff<T>(int id, Func<Task<T>> func) {}
这里的区别在于是否在lambda输入参数处设置
async
关键字,以及在表达式体调用其他异步方法时设置
await

就我所知,
选项1
选项2
似乎都很好,这让我觉得选项2只是多余的,或者可能是有害的

-

编辑:有人建议这是

然而,这是一个粗略的简化。另一个问题涉及在
async
方法上下文中简单使用
await
。这是一个关于在声明lambda表达式时是否引入
async
上下文的问题。

下面是一个更详细的问题。还有一个非常类似的问题,除了它涉及方法,你的问题涉及lambdas(由编译器转换成方法)


总之,这两种方法几乎是等效的。使用关键字确实会引入一个状态机,并会导致
wait
。在这种情况下,由于lambda只调用一个方法并返回其结果,因此省略关键字是合适的。

。这两者几乎相当。使用关键字确实会引入一个状态机并捕获上下文。在这种情况下,删除关键字是合适的。我不确定随机博客上的帖子是否等同于重复的stackoverflow帖子。也许你应该“elide”将此标记为重复,除非实际上有重复的帖子?
public async Task<T> InvokeStuff<T>()
{
    // option 1: keeping it simple
    return await DoStuff(1, () => GetStuff<T>());

    // option 2: verbose
    return await DoStuff(1, async () => await GetStuff<T>());

    // option 3: ???
}