使用TPL如何设置最大线程池大小

jge*_*tle 10 multithreading task-parallel-library c#-4.0

我正在使用TPL使用该函数将新任务添加到系统线程池Task.Factory.StartNew().唯一的问题是我添加了很多线程,我认为它为我的处理器创造了太多的处理能力.有没有办法在此线程池中设置最大线程数?

cri*_*mbo 15

默认值TaskScheduler(从中获取TaskScheduler.Default)的类型(内部类)ThreadPoolTaskScheduler.此实现使用ThreadPool类对任务进行排队(如果Task未使用TaskCreationOptions.LongRunning- 创建- 在这种情况下为每个任务创建新线程).

因此,如果要限制Task通过创建的对象new Task(() => Console.WriteLine("In task"))可用的线程数,可以限制全局线程池中的可用线程,如下所示:

// Limit threadpool size
int workerThreads, completionPortThreads;
ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);
workerThreads = 32;
ThreadPool.SetMaxThreads(workerThreads, completionPortThreads);
Run Code Online (Sandbox Code Playgroud)

调用ThreadPool.GetMaxThreads()是为了避免缩小completionPortThreads.

请注意,这可能是一个坏主意 - 因为没有指定调度程序的所有任务,以及任何数量的其他类使用默认的ThreadPool,将大小设置得太低可能会导致副作用:饥饿等.


Chr*_*ain 6

通常,TPL确定良好的"默认"线程池大小.如果您确实需要更少的线程,请参阅如何:创建限制并发度的任务计划程序