【问题标题】:ThreadPool Available Threads shows very high figuresThreadPool 可用线程显示非常高的数字
【发布时间】:2012-08-23 19:30:02
【问题描述】:

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

我们期望最大数量。当系统无法腾出尽可能多的线程(使用更高的工作负载)时,会产生 50 个线程进行处理,甚至更少。但是当我们打印编号时。使用 ThreadPool.GetAvailableThreads(out _iWorkerThreads, out _ioThreads) 在池中的可用线程中,我们得到一个常量 1023(对于工作线程的作业大小 50)并且没有 I/O 线程的数据。

不知道为什么会产生这么多线程。 ThreadPool.GetAvailableThreads 的输出可靠吗?设置线程池中的最大线程数会有所帮助吗?什么是评估平均数的可靠方法。池中的进程正在使用的托管线程数?

谁能指出为什么应用程序运行时 CPU 利用率会飙升至几乎 100%。该代码使用附加到每个作业的 WaitHandles,通常是 ManualResetEvents,用于向主线程发出作业完成的信号。

【问题讨论】:

  • 您是否在某个地方设置了起始线程数?这在理论上可能是一些默认值。
  • 它没有说线程是产生的。它只告诉你线程池管理器不会创建超过 1023 个线程。这可能会有所帮助:stackoverflow.com/questions/6000834/threadpool-max-threads
  • 好的。谁能指出我为什么在应用程序运行时 CPU 利用率会飙升到几乎 100%。该代码使用附加到每个作业的 WaitHandles,通常是 ManualResetEvents,用于向主线程发出作业完成的信号。

标签: c# threadpool


【解决方案1】:

这不是产生的线程数。这是在达到最大值之前可以产生的额外线程数。

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

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 2010-10-14
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2010-10-02
    相关资源
    最近更新 更多