线程池和Parallel.For组合 - 是否可能

时间:2016-11-11 15:49:34

标签: c# task-parallel-library

在我的应用程序中,我有许多可以使用Parallel.For语句计算其任务的类。每个Parallel.For都使用自己的ParallelOption来设置最大并行度。

应用程序流程依赖于用户设置,因此存在以下情况:类A(并行计算)调用类B(也可并行计算)或调用类C(不使用任何并行计算)

另一种模式是递归调用,在每个递归级别上进行并行计算。

我的问题:

是否可以设置一个全局线程池,供所有类使用它来进行计算,并且线程的数量是全局控制的?

是否可以将线程池​​与Parallel.For结合起来,以便大多数现有代码保持不变?

一个线程池与独立的parallel.for调用相比有多少开销(我知道这一切都取决于,到最后我需要做一些测试,但也许你有一些好的和坏的过期和良好的建议)< / p>

2 个答案:

答案 0 :(得分:2)

  

是否可以设置所有人使用的全局线程池   要进行计算的类,并控制线程的数量   全球申请?

情况已经如此。目前,应用程序线程池由.NET运行时管理。因此,您可以非常确定,所有类(在正在运行的应用程序中)都使用相同的线程池。您可以使用Task s,静态ThreadPool类或静态Parallel类来访问线程池。

  

是否可以将线程池​​与Parallel相结合。对于大多数情况而言   现有代码保持不变?

Parallel.For内部使用TasksTaskScheduler。因此,将使用相同的线程池。

答案 1 :(得分:0)

默认情况下,

MaxDegreeOfParallelism将使用所有线程池线程,并且针对您的cpu优化了线程池线程的数量。 Parallel.For仅在您希望使用给定循环的所有线程池线程时才有用。

只需使用TaskScheduler,不要过度思考。

稍后,如果您的应用确实需要它,您仍然可以使用自己的线程池创建自己的func_name(&$form, &$form_state) ...但实际上您不太可能需要这样做。