c# – 如何在返回集合的lambda中使用异步

前端之家收集整理的这篇文章主要介绍了c# – 如何在返回集合的lambda中使用异步前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个方法是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 type System.Collections.Generic.IEnumerable<ThingDetail>

我在哪里错了?

解决方法

>将您的物品收藏转换为任务< 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.

原文链接:https://www.f2er.com/csharp/95948.html

猜你在找的C#相关文章