Tag: 并行扩展

使用并行FOR循环节省时间

我有一个关于并行循环的问题。 我有以下代码: public static void MultiplicateArray(double[] array, double factor) { for (int i = 0; i < array.Length; i++) { array[i] = array[i] * factor; } } public static void MultiplicateArray(double[] arrayToChange, double[] multiplication) { for (int i = 0; i < arrayToChange.Length; i++) { arrayToChange[i] = arrayToChange[i] * multiplication[i]; } } public static void […]

MaxDegreeOfParallelism做什么?

我正在使用Parallel.ForEach,我正在做一些数据库更新,现在没有设置MaxDegreeOfParallelism,一个双核心处理器机器导致SQL客户端超时,其他四核心处理器机器不知何故超时。 现在,我无法控制运行代码的处理器内核的types,但是有些设置可以通过MaxDegreeOfParallelism更改,这样可能会同时运行更less的操作,并且不会导致超时? 我可以增加超时,但它不是一个好的解决scheme,如果在较低的CPU上,我可以同时处理较less的操作,这将减less对CPU的负载。 好吧,我也读过所有其他post和MSDN,但将MaxDegreeOfParallelism设置为较低的值,使我的四核心机器遭受? 例如,有没有办法做,如果CPU有两个核心,那么使用20,如果CPU有四个核心,然后40?

我应该使用ThreadPools或任务并行库进行IO绑定操作

在我的一个项目中,这是一个聚合器,我从网上parsing源,播客等等。 如果我使用顺序方法,考虑到大量资源,处理所有资源需要相当长的时间(由于networking问题和类似的东西); foreach(feed in feeds) { read_from_web(feed) parse(feed) } 所以我想要实现并发性,并不能决定是否应该基本上使用ThreadPools来处理工作线程或只是依靠TPL来进行sorting。 ThreadPools肯定会用工作线程来处理我的工作,我会得到我所期望的(在多核CPU环境下,其他核心也将被使用)。 但是我仍然想考虑TPL,因为它是推荐方法,但我有点担心。 首先我知道TPL使用ThreadPools,但增加了额外的决策层。 我主要关心的是单核环境存在的情况。 如果我没有错,TPL从一开始就有一个数字的工作线程开始,等于可用CPU内核的数量。 我害怕TPL在序列方法上产生类似的结果,这是我的IO界限的情况。 所以对于IO绑定的操作(在我的情况下,从网上读取资源),是最好使用ThreadPools和控制的东西,或者更好的只是依靠TPL? TPL也可以用于IO界限的情况吗? 更新 :我主要关心的是 – 在单核CPU环境下,TPL只是performance得像顺序方法,还是会提供并发性? 我已经阅读了与Microsoft .NET并行编程,所以这本书,但无法find一个确切的答案。 注意:这是我以前的问题的重新措辞[ 是否可以一起使用线程并发和并行? ]这是错误的措词。

何时处置CancellationTokenSource?

CancellationTokenSource类是一次性的,快速查看reflection器certificate非常可能KernelEvent托pipe资源KernelEvent 。 它没有终结者,所以如果我们不处理,GC就不会这样做。 另一方面,如果您查看MSDN取消文章中的示例,则除了一个之外,所有代码片段都不会这样做。 在代码中find正确的位置和时间似乎很难。 如果你不等待,你不能用代码开始你的并行任务。 只有在不等待的情况下,取消才有意义。 当然,你可以用Dispose调用在任务上添加ContinueWith ,但是这是怎么回事? 关于可取消的PLINQ查询,哪些不同步,但只是在最后做些什么? 比方说.ForAll(x => Console.Write(x)) ? 它可重用吗? 我们可以重复使用相同的标记进行多个调用,然后将其与主机组件一起处理,让我们说UI控制? 因为它没有类似Reset方法来清理IsCancelRequested和Token字段,所以我认为它是不可重用的,因此每次启动任务(或PLINQ查询)时都应该创build一个新的。 这是真的吗? 如果是的话,我的问题是什么是正确的和build议的策略来处理这些许多CancellationTokenSource实例处理?

并行sortingalgorithm

我正在寻找一个在C#中的并行(multithreading)sortingalgorithm的简单实现,它可以在List<T>或Arrays上运行,并可能使用并行扩展,但这部分并不是必须的。 编辑:弗兰克克鲁格提供了一个很好的答案,但是我希望将该示例转换为一个不使用LINQ。 另请注意, Parallel.Do()似乎已被Parallel.Invoke()取代。 谢谢。

Parallel.ForEach vs Task.Factory.StartNew

下面的代码片段有什么区别? 不会都使用线程池线程? 例如,如果我想调用集合中的每个项目的函数, Parallel.ForEach<Item>(items, item => DoSomething(item)); vs foreach(var item in items) { Task.Factory.StartNew(() => DoSomething(item)); }