.NET 4 ... Parallel.ForEach()问题

Bon*_*ver 18 .net c# parallel-processing

据我所知,新的TPL(任务并行库)已经实现了Parallel.ForEach(),因此它可以使用"表达的并行性".这意味着,它并不保证您的代理将在多个线程中运行,而是检查主机平台是否具有多个内核,如果为true,则仅在整个内核中分配工作(每个内核主要为1个线程) .

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

通常我会做类似下面的事情来将我的长时间运行操作放在ThreadPool的后台线程上:

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

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

我担心的是,如果我让TPL负责所有这些,我想确保它确定它是一个单核心盒,它仍然将Parallel.ForEach()循环内部的代码编组到一个后台线程上,就像我一样完成,以免阻止我的GUI.

感谢您的任何想法或建议......

SLa*_*aks 19

你的假设是不正确的.
Parallel.For总是一个阻塞的电话.

即使计算机有多个内核,它仍然会在返回之前等待所有线程完成.

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

  • 可以始终将其粘贴到任务中,并使用延续来等待它完成,然后通知UI. (3认同)