Tag: plinq

Plinq语句在静态构造函数中陷入僵局

我遇到了这种情况,其中静态构造函数中的以下plinq语句变得死锁: static void Main(string[] args) { new Blah(); } class Blah { static Blah() { Enumerable.Range(1, 10000) .AsParallel() .Select(n => n * 3) .ToList(); } } 它只在构造函数是静态时才会发生。 请有人向我解释一下。 是TPL错误吗? 编译器? 我?

在所有Linq查询中尝试使用Plinq是否可以?

我读到,如果发现PLinq更贵,PLinq将自动使用非并行Linq。 所以我想为什么不将PLinq用于所有事情(如果可能的话)并让运行时决定使用哪一个。 应用程序将部署到多核服务器,我可以开发更多代码来处理并行性。 使用plinq作为默认值有哪些缺陷?

订购PLINQ ForAll

关于PLINQ中的订单保存的msdn文档说明了关于ForAll()的以下内容。 订购源序列时的结果: 并行执行非确定性 源序列无序时的结果: 并行执行非确定性 这是否意味着永远不能保证ForAll方法的有序执行? 我之前没有使用PLINQ,但以下Code Review问题似乎是适合它的用法。 在我的回答的底部,我写道: Events.AsParallel().AsOrdered().ForAll( eventItem => { … } ); 阅读文档后,我相信AsOrdered()不会改变任何东西? 我也怀疑以前的查询不能替换顺序很重要的简单for循环? 可能还会发生对StringBuilder并行调用,导致输出错误?

如何使用具有二维数组的LINQ

我有一个二维字节数组,看起来像这样: 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 数组中的每个值只能是0或1.上面的简化示例显示了4行,每行有5列。 我试图找出如何使用LINQ将索引返回到具有最大数量的1s的行,在上面的示例中应该返回1。 以下非LINQ C#代码解决了这个问题: static int GetMaxIndex(byte[,] TwoDArray) { // This method finds the row with the greatest number of 1s set. // int NumRows = TwoDArray.GetLength(0); int NumCols = TwoDArray.GetLength(1); int RowCount, MaxRowCount […]

AsParallel的最大并行度()

使用Parallel.ForEach我们可以选择定义Parallel选项并设置Max Degree of Parallelism,如: Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > { // Do Work }) 但在做PLINQ时: Tabel.AsEnumberable() .AsParallel() .Where(//Logic) 我无法找到设置MaxDegreeOfParallelism 。 我也在网上抬头,但没有找到任何东西。 有没有人找到解决这个问题的方法? 任何帮助表示赞赏。

AsParallel究竟是如何工作的?

以下测试程序似乎没有下蹲。 这是因为我正在测试一个小清单吗? static void Main(string[] args) { List list = 0.UpTo(4); Test(list.AsParallel()); Test(list); } private static void Test(IEnumerable input) { var timer = new Stopwatch(); timer.Start(); var size = input.Count(); if (input.Where(IsOdd).Count() != size / 2) throw new Exception(“Failed to count the odds”); timer.Stop(); Console.WriteLine(“Tested ” + size + ” numbers in ” + timer.Elapsed.TotalSeconds […]

为什么PLINQ只使用两个线程?

说我有一个IO绑定任务。 我使用WithDegreeOfParallelism = 10和WithExecution = ForceParallelism模式,但查询仍然只使用两个线程。 为什么? 我知道PLINQ通常会选择一个与我的核心数相等的并行度,但为什么它忽略了我对更高并行性的特定要求呢? static void Main(string[] args) { TestParallel(0.UpTo(8)); } private static void TestParallel(IEnumerable input) { var timer = new Stopwatch(); timer.Start(); var size = input.Count(); if (input.AsParallel(). WithDegreeOfParallelism(10). WithExecutionMode(ParallelExecutionMode.ForceParallelism). Where(IsOdd).Count() != size / 2) throw new Exception(“Failed to count the odds”); timer.Stop(); Console.WriteLine(“Tested ” + size + ” numbers […]

PLINQ执行比常规LINQ更糟糕

令人惊讶的是,使用PLINQ并没有为我创建的小测试案例带来好处; 事实上,它甚至比平时更糟糕的LINQ。 这是测试代码: int repeatedCount = 10000000; private void button1_Click(object sender, EventArgs e) { var currTime = DateTime.Now; var strList = Enumerable.Repeat(10, repeatedCount); var result = strList.AsParallel().Sum(); var currTime2 = DateTime.Now; textBox1.Text = (currTime2.Ticks-currTime.Ticks).ToString(); } private void button2_Click(object sender, EventArgs e) { var currTime = DateTime.Now; var strList = Enumerable.Repeat(10, repeatedCount); var result = strList.Sum(); […]

如何依靠I / O大量正确地并行工作

我正在构建一个必须处理大量数据的控制台应用程序。 基本上,应用程序从数据库中获取引用。 对于每个引用,解析文件的内容并进行一些更改。 这些文件是HTML文件,并且该过程正在使用RegEx替换进行繁重的工作(查找引用并将它们转换为链接)。 然后将结果存储在文件系统中并发送到外部系统。 如果我按顺序恢复该过程: var refs = GetReferencesFromDB(); // ~5000 Datarow returned foreach(var ref in refs) { var filePath = GetFilePath(ref); // This method looks up in a previously loaded file list var html = File.ReadAllText(filePath); // Read html locally, or from a network drive var convertedHtml = ParseHtml(html); File.WriteAllText(destinationFilePath); // Copy the […]