我可以并行执行Linq OrderBy异步调用吗?

时间:2012-05-22 03:15:23

标签: c# .net linq sorting asynchronous

我有一个linq查询的订单,像这样:

var sortedList = unsortedList
                    .OrderBy(foo => foo.GetCurrentValue())

但是,方法GetCurrentValue响应缓慢(因为它涉及网络通信并且具有相当大的延迟)。据我观察,上面的代码连续调用方法(调用必须在调用下一个调用之前完成,所以如果列表很长,那么排序将非常慢。

有没有办法告诉linq并行执行此操作?即异步评估表达式,然后在每个人完成后比较结果?

如果没有,任何想法如何干净利落地完成我们自己的实施?

1 个答案:

答案 0 :(得分:2)

MSDN在PLINQ中有一篇专门关于“订单保存”的文章 - http://msdn.microsoft.com/en-us/library/dd460677.aspx(根据我之前的评论)。链接给出的一个例子:

var cityQuery = (from city in cities.AsParallel()
                 where city.Population > 10000
                 select city);

只是把它扔出去作为一种可能的实现,这样的事情?其中slowList是“慢”对象的可枚举集合。 Parallel.ForEach可以替换为任何其他异步“staging”操作来收集慢值。

    var stage1List = new List<dynamic>();
    var parOpt = new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = 30 };

    System.Threading.Tasks.Parallel.ForEach(slowList, parOpt, slowObj =>
    {
        stage1List.Add(new { Obj = slowObj, Value = slowObj.GetSlowValue() });
    });

    var stage2List = stage1List.OrderBy(p => p.Value).Select(p => p.Obj);