如何在返回集合的lambda中使用async

我有一个异步“上游”的方法。 我正在尝试遵循最佳实践并在堆栈中一直进行qith异步。

在MVC中的Controller操作中,我可以预见到死锁问题如果我依赖.Result()。

将Controller操作更改为异步似乎是要走的路,尽管问题是在lambda中多次调用async方法。

我如何等待返回多个结果的lamda?

public async Task GetLotsOfStuff() { IEnumerable things= previouslyInitialisedCollection .Select(async q => await GetDetailAboutTheThing(q.Id))); return Json(result, JsonRequestBehavior.AllowGet); } 

您可以看到我尝试使lambda异步,但这只是一个编译器exception:

无法转换源类型

System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task到目标类型System.Collections.Generic.IEnumerable

我在哪里错了?

  • 将您的Thing s集合转换为Task的集合。
  • 然后使用Task.WhenAll加入所有这些任务并等待它。
  • 等待联合任务会给你一Thing[]

 public async Task GetLotsOfStuff() { IEnumerable> tasks = collection.Select(q => GetDetailAboutTheThing(q.Id)); Task jointTask = Task.WhenAll(tasks); IEnumerable things = await jointTask; return Json(things, JsonRequestBehavior.AllowGet); } 

或者,简洁地使用类型推断:

 public async Task GetLotsOfStuff() { var tasks = collection.Select(q => GetDetailAboutTheThing(q.Id)); var things = await Task.WhenAll(tasks); return Json(things, JsonRequestBehavior.AllowGet); } 

小提琴: https : //dotnetfiddle.net/78ApTI

注意:由于GetDetailAboutTheThing似乎返回Task ,因此约定是将Async附加到其名称 – GetDetailAboutTheThingAsync