ThreadPool可用线程显示非常高的数字

时间:2012-08-23 19:30:02

标签: c# threadpool

我们遇到的情况是,我们正在使用ThreadPool.QueueUserWorkItem()API从作业队列中的for循环中生成多个线程来执行一些文件复制操作。作业队列包含大约50个项目(用于测试目的)。

我们期待最大数量没有。当系统无法保留多个线程(使用更高的工作负载)时,会产生50个线程进行处理,甚至更少。但是当我们打印出来的时候。使用ThreadPool.GetAvailableThreads(out _iWorkerThreads,out _ioThreads)中池中的可用线程,我们得到一个常量1023(工作线程的作业大小为50),而没有I / O线程的数据。

不确定为什么会产生如此多的线程。 ThreadPool.GetAvailableThreads的输出是否可靠?是否有助于在线程池中设置最大线程数?什么是评估平均值的可靠方法。来自池的进程使用的托管线程?

任何人都可以指出为什么当应用程序运行时CPU利用率几乎达到100%。代码使用WaitHandles(通常为ManualResetEvents)附加到每个作业,以通知主线程完成作业。

1 个答案:

答案 0 :(得分:4)

这不是衍生线程的数量。这是在达到最大值之前可以生成的其他线程数。

MSDN:ThreadPool.GetAvailableThreads Method

GetMaxThreads减去GetAvailableThreads可能是你要找的号码。

不做任何事情:

class Program
{
    static void Main(string[] args) {
        int workerThreads, completionPortThreads;
        ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
        Console.WriteLine(workerThreads);
        Console.WriteLine(completionPortThreads);
        Console.ReadLine();
    }
}

输出结果为:

1023
1000

如果您确定在知道某些线程仍在工作时调用ThreadPool.GetAvailableThreads,则该数字应该更低。

示例:

    static void Main(string[] args) {
        int workerThreads, completionPortThreads;
        ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
        Console.WriteLine(workerThreads);
        Console.WriteLine(completionPortThreads);

        Console.WriteLine();
        ThreadPool.QueueUserWorkItem(o => Thread.Sleep(10000));

        ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
        Console.WriteLine(workerThreads);
        Console.WriteLine(completionPortThreads);

        Console.ReadLine();
    }

输出结果为:

1023
1000

1022
1000