c# - Parallel.ForEach - 它在单核机器上运行在哪里?

标签 c# .net parallel-processing task-parallel-library parallel.foreach

我了解到新的 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/

相关文章:

c# - IInvokeProvider 命名空间?

c# - C#中的Java内部类

c# - 你如何以编程方式调用 ListView 标签编辑

c++ - 并行容器 - 同步元素删除

memory - 共享内存与消息传递如何处理大型数据结构?

c# - 将工作簿名称传递到 For 循环 C#

c# - 使用其中的代码创建 mustoveride 函数

c# - WCF 服务方法在 WCF 测试客户端中不可用,因为它使用类型

c# - 在 switch-case 条件中编写 switch-case 条件的可能性?

oracle - 有没有办法保证 PL/SQL 作业的 DAP?