2011-01-05 132 views
18

我知道新的TPL(任务并行库)已经实现了Parallel.ForEach(),因此它可以与“表达的并行性”一起工作。这意味着,它并不能保证你的委托将运行在多个线程中,而是检查主机平台是否有多个内核,如果是的话,它只能在整个内核中分配工作(每个内核基本上只有1个线程) 。.NET 4 ... Parallel.ForEach()问题

如果主机系统没有多个核心(越来越难找到这样的计算机),那么它会像“常规”foreach循环那样按顺序运行你的代码。坦率地说,非常酷的东西。

通常我会做类似下面放置从线程池在后台线程我长时间运行的操作:

ThreadPool.QueueUserWorkItem(新WaitCallback(targetMethod),新Object2PassIn());

在主计算机只有一个核心的情况下,TPL的Parallel.ForEach()会自动将调用放在后台线程上吗?或者,我是否应该从后台管理员那里调用任何TPL调用,以便如果我从一台核心计算机执行,至少该逻辑将不在GUI的调度线程中?

我担心的是,如果我让TPL负责这一切,我想确保它是否确定它是一个单核心框,它仍然将在Parallel.ForEach()循环内部的代码编组到后台线程中就像我会做的一样,以免阻塞我的GUI。

感谢您的任何想法或意见...

+1

只需快速跟进:TPL Rocks!无法通过使用TPL呼叫与“标准”票价进行一些小的调整,就能够让我能够制作各种应用程序的速度快得多。我正在关注削减80%以上的各种物品的加工时间。 MS真的把它从这个公园里淘汰出去了 - 很棒的工作人员。 – BonanzaDriver 2011-01-06 01:52:56

回答

19

你的假设是不正确的。
Parallel.For总是阻塞呼叫。

即使计算机有多个核心,它仍然会等待所有线程完成后才返回。

如果您不想冻结UI,您将始终需要显式调用ThreadPool。

+0

酷 - 谢谢SLaks – BonanzaDriver 2011-01-05 02:32:34

+3

可以随时将其粘贴到一个任务,并使用延续等待它的完成,然后通知用户界面。 – 2011-01-05 02:52:54

0

我想如果你有关于实例/线程数的确切需求,你需要自己动手。我得到的印象是,Parallel.ForEach类型的调用是用于声明性地获取核心。我不确定,但我有一个鬼鬼祟祟的怀疑,这是阻止I/O(作为一个例子)的东西不好的选择。

+0

从我迄今为止阅读的文档中,它最初是为“处理器边界”问题集构想的。但是,这并不排除将它用于IO。事实上,让我认真看待TPL的事实是,我有一个应用程序,可以执行大约7,800个网页查询......我有一个运行24GB RAM的双核四核处理器盒(3.0 GHz Xeon)在Windows 7旗舰版64位版本...和那些需要约25至28分钟才能完成。还有一些额外的下载HTML处理,但你明白我的观点。我将其改为TPL呼叫,耗时<5分钟。 – BonanzaDriver 2011-01-05 02:39:24

0

好问题。我认为即使只有一个核心,它仍会产生一个线程。我将不得不在一台核心机器上运行测试。由于我没有,我将使用虚拟机并将其环境CPU设置为1,并查看Parallel ForEach会产生多少线程。

您可能需要阅读以下内容:

Does Parallel limit the Number of Active Threads

1

通过我与Parallel.ForEach和经验的Parallel.For循环,我已经注意到了,为了能进能出的顺序,有些东西你可能想在实施之前考虑。

如用于回路中的基本会产生:

产品1 产品2 产品3 产品4

和并联循环能产生,但并不总是:

产品3 产品1 产品2 产品4

只要记住小伙子们。