1

我有一个 linq 查询的订单,如下所示:

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

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

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

如果没有,知道如何干净、轻松地制作我们自己的实现吗?

4

1 回答 1

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可以用任何其他异步“登台”操作代替以收集慢速值。

    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);
于 2012-05-22T03:44:15.467 回答