自 .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/