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。

谢谢!

TPL线程计数

问题是您正在使用Thread.Sleep而不是实际工作,因此ThreadPool看到您已经阻塞了线程,并开始注入新线程。这将导致线程数随着时间的推移而增长。

如果你要做真正的工作而不是睡觉,这就不会发生,因为ThreadPool会看到线程实际上在执行工作,新线程不会加快总吞吐量。

现在,在这种情况下,您的延续似乎是实际工作的大部分,在这种情况下,您最好根本没有初始任务:

while (tasksLeftToRun != 0)
{
    var nextTask = new Task.Factory.StartNew(()=>
    {
        //... Actual work
    }), cancellationToken);
    tasksLeftToRun--;
}

然而,由于看起来您正在处理任务的"队列"(您有这么多任务要创建),您可能想要调查Parallel类是否更适合于此。如果"作品"以某种形式存储,使用Parallel.ForEach甚至PLINQ可能更合适。