TPL线程计数
本文关键字:线程 TPL | 更新日期: 2023-09-27 18:03:50
我有一个问题要问。net 4.0 TPL程序员。我创建了这个TPL和ThreadPool压力测试器,我运行X个测试,每个测试执行Y个任务,当完成时,它继续进行下一个测试。
我遇到的问题是,如果一个测试启动100个任务,下面的测试将添加更多的任务,等等,给我留下大量的线程。
(线程数我已经从资源监视器)。
伪代码:
while (tasksLeftToRun != 0)
{
var nextTask = new Task(new Action(()=>
{
Thread.Sleep(20);
}), cancellationToken);
nextTask.Start();
nextTask.ContinueWith((t) =>
{
//...
},TaskScheduler.Default);
tasksLeftToRun--;
}
在应用程序完成测试后大约15秒,线程数下降到~7。
谢谢!
问题是您正在使用Thread.Sleep
而不是实际工作,因此ThreadPool看到您已经阻塞了线程,并开始注入新线程。这将导致线程数随着时间的推移而增长。
如果你要做真正的工作而不是睡觉,这就不会发生,因为ThreadPool会看到线程实际上在执行工作,新线程不会加快总吞吐量。
现在,在这种情况下,您的延续似乎是实际工作的大部分,在这种情况下,您最好根本没有初始任务:
while (tasksLeftToRun != 0)
{
var nextTask = new Task.Factory.StartNew(()=>
{
//... Actual work
}), cancellationToken);
tasksLeftToRun--;
}
然而,由于看起来您正在处理任务的"队列"(您有这么多任务要创建),您可能想要调查Parallel
类是否更适合于此。如果"作品"以某种形式存储,使用Parallel.ForEach
甚至PLINQ可能更合适。