我有一个方法是Async“上游”.我试图遵循最佳实践,并全力以赴,在堆栈中一路颠倒.
在MVC内的Controller操作中,我可以预测到遇到死锁问题,如果我依赖于.Result().
将Controller操作更改为异步似乎是要走的路,尽管问题是在lambda中多次调用async方法.
我怎么能等待一个返回多个结果的lamda?
public async Task<JsonResult> GetLotsOfStuff() { IEnumerable<ThingDetail> things= prevIoUslyInitialisedCollection .Select(async q => await GetDetailAboutTheThing(q.Id))); return Json(result,JsonRequestBehavior.AllowGet); }
你可以看到我已经尝试了使用lambda异步,但这只是给出一个编译器异常:
无法转换源类型
System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task<ThingDetail>
to target typeSystem.Collections.Generic.IEnumerable<ThingDetail>
我在哪里错了?
解决方法
>将您的物品收藏转换为任务< Thing> s的集合.
>然后使用Task.WhenAll加入所有这些任务并等待它.
等待共同的任务会给你一件事[]
>然后使用Task.WhenAll加入所有这些任务并等待它.
等待共同的任务会给你一件事[]
public async Task<JsonResult> GetLotsOfStuff() { IEnumerable<Task<ThingDetail>> tasks = collection.Select(q => GetDetailAboutTheThing(q.Id)); Task<int[]> jointTask = Task.WhenAll(tasks); IEnumerable<ThingDetail> things = await jointTask; return Json(result,JsonRequestBehavior.AllowGet); }
或者,简洁地使用类型推断:
public async Task<JsonResult> GetLotsOfStuff() { var tasks = collection.Select(q => GetDetailAboutTheThing(q.Id)); var things = await Task.WhenAll(tasks); return Json(result,JsonRequestBehavior.AllowGet); }
小提琴:https://dotnetfiddle.net/78ApTI
注意:由于GetDetailAboutTheThing似乎返回任务< Thing>,约定是将Async附加到其名称 – GetDetailAboutTheThingAsync.