c# – 如何在返回集合的lambda中使用异步
发布时间:2020-12-15 06:18:06 所属栏目:百科 来源:网络整理
导读:我有一个方法是Async“上游”.我试图遵循最佳实践,并全力以赴,在堆栈中一路颠倒. 在MVC内的Controller操作中,我可以预测到遇到死锁问题,如果我依赖于.Result(). 将Controller操作更改为异步似乎是要走的路,尽管问题是在lambda中多次调用async方法. 我怎么能
我有一个方法是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异步,但这只是给出一个编译器异常: 无法转换源类型
解决方法
>将您的物品收藏转换为任务< Thing> s的集合.
>然后使用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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |