【发布时间】:2011-01-05 02:11:26
【问题描述】:
我了解新的 TPL(任务并行库)已经实现了 Parallel.ForEach(),因此它可以与“表达的并行性”一起使用。意思是,它不保证您的委托将在多个线程中运行,而是检查主机平台是否有多个内核,如果为真,那么它才会在内核之间分配工作(基本上每个内核 1 个线程) .
如果主机系统没有多个内核(越来越难找到这样的计算机),那么它将像“常规” foreach 循环一样按顺序运行您的代码。很酷的东西,坦率地说。
通常我会执行以下操作,将长时间运行的操作放在 ThreadPool 的后台线程上:
ThreadPool.QueueUserWorkItem(new WaitCallback(targetMethod), new Object2PassIn());
在主机只有一个内核的情况下,TPL 的 Parallel.ForEach() 是否会自动将调用置于后台线程上?或者,我是否应该从后台手动调用任何 TPL 调用,以便如果我从单核计算机执行,至少该逻辑将脱离 GUI 的调度线程?
我担心的是,如果我让 TPL 负责所有这一切,我想确保它是否确定它是一个单核盒,它仍然将 Parallel.ForEach() 循环内部的代码编组到后台线程,例如我会这样做,以免阻止我的 GUI。
感谢您的任何想法或建议...
【问题讨论】:
-
快速跟进一下:TPL Rocks!无法克服使用 TPL 调用与“标准”票价相比,只需进行一些小的调整,我就能以多快的速度制作各种应用程序。我正在观察各种项目的处理时间减少了 80% 以上。 MS 真的把它从这个公园里淘汰了 - 干得好。
标签: c# .net parallel-processing