Task.WhenAll 与 LINQ 选择 [英] Task.WhenAll with LINQ select

查看:26
本文介绍了Task.WhenAll 与 LINQ 选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

long[] orderIds={10,11,12,13};

var orders= new List<Order>();

await Task.WhenAll(orderIds.Select(async (orderId) =>
{
    var orderDetails = await GetOrderDetails(orderId);

    if (orderDetails != null)
        orders.Add(orderDetails);
}));

我遇到了一些错误的行为,在将此代码部署到服务器后,它工作正常,但在本地有时它会添加所有订单,但有时它会错过一些订单.

I am getting some wrong behavior with this, after deployement this code to server its working fine but on local sometimes it is adding all orders but sometime it missed some orders.

任何人都可以帮忙缩短这个,不知道我错过了什么.

Can anybody please help to short out this, not sure what I am missing.

推荐答案

首先,我建议在将任务发送到任何地方之前强制枚举任务(例如额外的 ToList() 调用).您不想意外地多次枚举列表.

First, I recommend forcing enumeration of the tasks (e.g. an extra ToList() call) before sending them anywhere. You wouldn't want to accidentally enumerate the list more than once.

var tasks = orderIds.Select( orderId => GetOrderDetails(orderId) ).ToList();

然后等待任务:

await Task.WhenAll( tasks );

瞧,您的订单已准备就绪.

And voila, your orders are ready.

var orders = tasks.Select( t => t.Result ).Where( o => o != null ).ToList();

顺便说一句,没有任何东西被改变,所以你是完全线程安全的,不需要任何锁(假设 GetOrderDetails 是线程安全的).这是函数式方法的优势之一 使用 linq 和一般.

BTW nothing is being mutated so you're completely thread-safe without any need for locks (assuming GetOrderDetails is thread-safe). This is one of the advantages of a functional approach to using linq and in general.

这篇关于Task.WhenAll 与 LINQ 选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆