如何在返回集合的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
。