c# - 当所有并行工作单元必须同时运行时,任务是否是合适的选择?

标签 c# .net multithreading c#-4.0 task-parallel-library

自 .NET 4.0 以来,任务(TPL)是执行并行性的推荐方式,因为它们是更高的抽象并让运行时更好地优化事情。

但是在所有工作单元必须同时发生的情况下,TPL 仍然是/最好的选择吗?

我的用例是生成多个 PsExec 实例(大约 10 个),以便在多台远程 PC 上同时运行相同的进程,并等待每个实例退出。 TPL 进行的任何导致并行运行所有实例的“优化”都将是灾难性的。

这个用例是否超出了 TPL 的范围,我最好只启动线程?

我知道您一次执行的线程不能超过您拥有的内核,但 Windows 将通过切片运行比内核更多的线程,这是可以接受的,但安排任何线程在其他线程完成之前不运行是 Not Acceptable 。

最佳答案

来自 documentation :

The TPL scales the degree of concurrency dynamically to most efficiently use all the processors that are available

但是你的场景,

"all work units must happen at once"

就是这样,不能保证所有进程都是并行的。并行化的数量将取决于您拥有的资源数量(在本例中为处理器/线程)。即使有资源,成功也会受到您需要并行化的单元数量的阻碍。

另外:

TPL 使用线程池,这意味着您的工作排队到线程池中的线程。但是你说

"but scheduling any thread not to run until others have completed is not"

当您的工作单元多于线程池中的可用线程数时,这可能会被违反。

实际上我的意见是处理基本的线程,适合这样一个微妙/敏感的任务。

关于c# - 当所有并行工作单元必须同时运行时,任务是否是合适的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28851134/

相关文章:

c# - 为什么编译器不能推断大数是长数?

multithreading - Delphi:Indy TIdTCPClient 读取数据

c# - 在 C# 中缩放图像的好方法是什么?

c# - 使用 Open XML SDK 2.0 或 Linq 在 Word 2010 中删除自定义属性的内容

c# - Dapper 读取 SqlHierachyId 列(SQL Server 2008 R2)

.net - 获取错误 : System. IO.FileNotFoundException:无法加载文件或程序集

java - "putIfAbsent"在CHM中如何工作?

java - ConcurrentHashMap 作为具有同步的单例缓存

c# - 十六进制输出中的扩展工具包的 NumericUpDown

c# - All 与 Any LINQ 查询的组合意味着什么