我有一个linq查询的订单,像这样:
var sortedList = unsortedList
.OrderBy(foo => foo.GetCurrentValue())
但是,方法GetCurrentValue响应缓慢(因为它涉及网络通信并且具有相当大的延迟)。据我观察,上面的代码连续调用方法(调用必须在调用下一个调用之前完成,所以如果列表很长,那么排序将非常慢。
有没有办法告诉linq并行执行此操作?即异步评估表达式,然后在每个人完成后比较结果?
如果没有,任何想法如何干净利落地完成我们自己的实施?
答案 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);