我正在尝试确定AsParallel()如何拆分它的'source',实际上'source'是什么意思......
例如......
public class CSVItem
{
public DateTime Date { get; set; }
public string AccountNumber { get; set; }
}
List<CSVItem> CSVItemList = new List<CSVItem>();
然后将500k不同的CSVItem放入CSVItemList。
然后使用:
CSVItemList = CSVItemList.AsParallel().OrderBy(x => x.AccountNumber).ThenBy(q => q.Date).ToList();
它是否只将'source'(意味着例如250k记录到两个线程中的每一个上)拆分到多个异步线程上并执行OrderBy()。然后在每个线程上的ThenBy()合并结果......
或者它会将OrderBy()和ThenBy()分离到不同的线程并运行它们然后合并结果......给出一个奇怪的有序列表?
答案 0 :(得分:4)
它一个接一个地出现
a)完成OrderBy
合并结果而不是gose for
b)ThenBy
。下面的图片形式 Albahari博客显示它是如何工作的,即它一个接一个地
问:任务数量
A:您可以使用WithDegreeOfParallelism
强制PLINQ同时运行指定数量的任务来判断这一点
//create 5 task
List.AsParallel().WithDegreeOfParallelism(5)
答案 1 :(得分:2)
我创建了一个小例子来检查,哪一个是真的。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static void Main(string[] args)
{
List<TestItem> items = new List<TestItem>();
List<TestItem> itemsNonParallel = new List<TestItem>();
items.Add(new TestItem() { Age = 1, Size = 12 });
items.Add(new TestItem() { Age = 2, Size = 1 });
items.Add(new TestItem() { Age = 5, Size = 155 });
items.Add(new TestItem() { Age = 23, Size = 42 });
items.Add(new TestItem() { Age = 7, Size = 32 });
items.Add(new TestItem() { Age = 9, Size = 22 });
items.Add(new TestItem() { Age = 34, Size = 11 });
items.Add(new TestItem() { Age = 56, Size = 142 });
items.Add(new TestItem() { Age = 300, Size = 13 });
itemsNonParallel.Add(new TestItem() { Age = 1, Size = 12 });
itemsNonParallel.Add(new TestItem() { Age = 2, Size = 1 });
itemsNonParallel.Add(new TestItem() { Age = 5, Size = 155 });
itemsNonParallel.Add(new TestItem() { Age = 23, Size = 42 });
itemsNonParallel.Add(new TestItem() { Age = 7, Size = 32 });
itemsNonParallel.Add(new TestItem() { Age = 9, Size = 22 });
itemsNonParallel.Add(new TestItem() { Age = 34, Size = 11 });
itemsNonParallel.Add(new TestItem() { Age = 56, Size = 142 });
itemsNonParallel.Add(new TestItem() { Age = 300, Size = 13 });
foreach (var item in items.AsParallel().OrderBy(x => x.Age).ThenBy(x => x.Size))
{
Console.WriteLine($"Age: {item.Age} Size: {item.Size}");
}
Console.WriteLine("---------------------------");
foreach (var item in itemsNonParallel.OrderBy(x => x.Age).ThenBy(x => x.Size))
{
Console.WriteLine($"Age: {item.Age} Size: {item.Size}");
}
Console.ReadLine();
}
}
public class TestItem
{
public int Age { get; set; }
public int Size { get; set; }
}
<强>结果强>
AsParallel()做我们想要的。它首先处理 OrderBy()并行,合并回列表然后转到下一个查询,在我们的例子中 ThenBy()。