.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: ???
}