Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AsParallel()如何拆分它';s';来源';?_C#_Multithreading_Plinq - Fatal编程技术网

C# AsParallel()如何拆分它';s';来源';?

C# AsParallel()如何拆分它';s';来源';?,c#,multithreading,plinq,C#,Multithreading,Plinq,我试图确定AsParallel()如何拆分它的“源”,以及“源”的真正含义 例如 public class CSVItem { public DateTime Date { get; set; } public string AccountNumber { get; set; } } List<CSVItem> CSVItemList = new List<CSVItem>(); 它是否只会将“源”(例如,两个线程中的每个线程上有250k条记录)拆分为

我试图确定AsParallel()如何拆分它的“源”,以及“源”的真正含义

例如

public class CSVItem
{
    public DateTime Date { get; set; }
    public string AccountNumber { get; set; }
}

List<CSVItem> CSVItemList = new List<CSVItem>();
它是否只会将“源”(例如,两个线程中的每个线程上有250k条记录)拆分为多个异步线程,并在每个线程上执行OrderBy()。然后在每个线程上执行OrderBy(),然后合并结果

或者它会将OrderBy()和ThenBy()分离到不同的线程上,然后运行它们,然后合并结果。。。给出一个顺序奇怪的列表?

它一个接一个地出现了 a) 使用
OrderBy
合并结果和gose完成 b)
然后通过
。下图形式为Albahari博客展示了它的工作原理,即一个接一个地进行

Q:有多少任务

A:您可以通过使用
with degreeofparallelism
强制PLINQ同时运行指定数量的任务来确定这一点

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

检查这个:

我创建了一个小例子来检查,哪一个是正确的

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; }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
静态void Main(字符串[]参数)
{
列表项=新列表();
List itemsNonParallel=新列表();
添加(新的TestItem(){Age=1,Size=12});
添加(新TestItem(){Age=2,Size=1});
添加(新的TestItem(){Age=5,Size=155});
添加(新的TestItem(){Age=23,Size=42});
添加(新的TestItem(){Age=7,Size=32});
添加(新的TestItem(){Age=9,Size=22});
添加(新的TestItem(){Age=34,Size=11});
添加(新的TestItem(){Age=56,Size=142});
添加(新的TestItem(){Age=300,Size=13});
Add(newtestItem(){Age=1,Size=12});
Add(newtestItem(){Age=2,Size=1});
Add(newtestItem(){Age=5,Size=155});
Add(newtestItem(){Age=23,Size=42});
Add(newtestItem(){Age=7,Size=32});
Add(newtestItem(){Age=9,Size=22});
Add(newtestItem(){Age=34,Size=11});
Add(newtestItem(){Age=56,Size=142});
Add(newtestItem(){Age=300,Size=13});
foreach(items.AsParallel()中的var item.OrderBy(x=>x.Age).然后by(x=>x.Size))
{
WriteLine($“年龄:{item.Age}大小:{item.Size}”);
}
Console.WriteLine(“-------------------------------”;
foreach(itemsNonParallel.OrderBy(x=>x.Age.ThenBy(x=>x.Size))中的var项)
{
WriteLine($“年龄:{item.Age}大小:{item.Size}”);
}
Console.ReadLine();
}
}
公开课测验
{
公共整数{get;set;}
公共整数大小{get;set;}
}
结果


AsParallel()做我们想做的事。它首先并行处理OrderBy(),合并列表,然后转到下一个查询,在我们的例子中是ThenBy()。

您确定吗?一般来说,MSDN意味着它有点模糊。。。查询将源划分为多个线程上异步执行的任务。每个任务完成的顺序不仅取决于处理分区中元素所涉及的工作量,还取决于外部因素,如操作系统如何安排每个线程请参阅@PaulZahra-当涉及并行linqA列表比较时,我使用此作为参考。。。。不确定list1.Exception(list2)对此是否正确。。。因为我们想检查订单而不是内容。。。然后我们就可以在庞大的列表上运行代码,并很容易进行比较。。。序列等于给假。。。虽然列表看起来一样@PaulZahra:
SequenceEqual
返回false,因为当检查两个对象是否相等时,默认情况下会根据它们是否引用同一对象来确定。简单的解决方法是将代码替换为
itemsNonParallel
itemsNonParallel=items.ToList()添加一组测试项,从而在两个列表中存储相同的对象。文章可能包含您问题的答案(第5页底部)。我在另一个问题中发现了它
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; }
}