AsParallel()如何拆分它的'源'?

时间:2015-07-10 12:28:52

标签: c# multithreading plinq

我正在尝试确定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()分离到不同的线程并运行它们然后合并结果......给出一个奇怪的有序列表?

2 个答案:

答案 0 :(得分:4)

它一个接一个地出现 a)完成OrderBy合并结果而不是gose for b)ThenBy。下面的图片形式 Albahari博客显示它是如何工作的,即它一个接一个地

enter image description here

问:任务数量

A:您可以使用WithDegreeOfParallelism强制PLINQ同时运行指定数量的任务来判断这一点

   //create 5 task
   List.AsParallel().WithDegreeOfParallelism(5)

请检查:Parallel Programming

答案 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()