我了解到新的 TPL (任务并行库)已实现 Parallel.ForEach
这样它就可以与“表达的并行性”一起工作。这意味着它不保证您的委托(delegate)将在多个线程中运行,而是检查主机平台是否有多个内核,如果是,则它只会在内核之间分配工作(基本上每个内核 1 个线程) .
如果主机系统没有多核(越来越难找到这样的计算机),那么它将像每个循环的“常规”一样按顺序运行您的代码。坦率地说,非常酷的东西。
通常我会做类似下面的事情,将长时间运行的操作放在 ThreadPool
的后台线程上:
ThreadPool.QueueUserWorkItem(new WaitCallback(targetMethod), new Object2PassIn() );
在主机只有一个内核的情况下,TPL 的 Parallel.ForEach
会自动将调用置于后台线程上吗?或者,我是否应该从后台线程手动调用任何 TPL 调用,以便如果我从单核计算机执行,至少该逻辑将脱离 GUI 的调度线程?
我担心的是,如果我让 TPL 负责所有这一切,我想确保它是否确定它是一个单一的核心框,它仍然将 Parallel.ForEach
循环内的代码编码到一个后台线程,就像我会做的那样,不会阻塞我的 GUI。
最佳答案
你的假设不正确。
Parallel.For
始终是阻塞调用。
即使计算机有多个内核,它仍然会等待所有线程完成后再返回。
如果您不想卡住 UI,您将始终需要显式调用 ThreadPool。
关于c# - Parallel.ForEach - 它在单核机器上运行在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600248/