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

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.