Pro*_*m.X 15 c# linq asp.net-mvc lambda asynchronous
我有一个异步"上游"的方法.我正在尝试遵循最佳实践并在堆栈中一直进行qith异步.
在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);
}
Run Code Online (Sandbox Code Playgroud)
您可以看到我尝试使lambda异步,但这只是一个编译器异常:
无法转换源类型
System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task<ThingDetail>目标类型System.Collections.Generic.IEnumerable<ThingDetail>
我在哪里错了?
dca*_*tro 17
Things 集合转换为s的集合Task<Thing>.Task.WhenAll并等待它来加入所有这些任务.Thing[]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(things, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
或者,简洁地使用类型推断:
public async Task<JsonResult> GetLotsOfStuff()
{
var tasks = collection.Select(q => GetDetailAboutTheThing(q.Id));
var things = await Task.WhenAll(tasks);
return Json(things, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
小提琴:https://dotnetfiddle.net/78ApTI
注意:因为GetDetailAboutTheThing似乎返回a Task<Thing>,约定是附加Async到它的名字 - GetDetailAboutTheThingAsync.
| 归档时间: |
|
| 查看次数: |
8067 次 |
| 最近记录: |