确定C#中线程池中等待的线程数

时间:2015-02-18 23:28:35

标签: c# multithreading

是否可以看到有多少线程在Threadpool队列中等待执行?

如果我这样做:

for (int i = 0; i < 5000; i++)
{
    tasks.Add(Task.Run(() => { TaskTest(); }));
}
Task.WaitAll(tasks.ToArray());

在TaskTest中,我做了一些通常需要大约500毫秒的工作,我还更新了一个看到线程数最多的变量:

ThreadPool.GetMaxThreads(out maxthreads, out completionthreads);
ThreadPool.GetAvailableThreads(out availablethreads, out completionthreads);

int threads_in_use = maxthreads - availablethreads;
mHighwaterThreads = Math.Max(mHighwaterThreads, threads_in_use);

我的电脑的最大线程数通常在32000以上.mHighwaterThreads通常在75左右。

我想知道是否有办法查看有多少线程在Threadpool中等待执行。

2 个答案:

答案 0 :(得分:3)

有一个ThreadPool.PendingWorkItemCount属性。

https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.pendingworkitemcount?view=netcore-3.1

如果您正在运行.net core,则另一种可能性是运行dotnet counters monitor --process-id 123

这将为您提供一些运行时指标的控制台显示。我相信您要查询的指标是倒数第三。

Press p to pause, r to resume, q to quit.
    Status: Running

[System.Runtime]
    % Time in GC since last GC (%)                         0
    Allocation Rate / 1 sec (B)                       66,480
    CPU Usage (%)                                          0
    Exception Count / 1 sec                                0
    GC Heap Size (MB)                                    234
    Gen 0 GC Count / 60 sec                                0
    Gen 0 Size (B)                               200,991,744
    Gen 1 GC Count / 60 sec                                0
    Gen 1 Size (B)                                   385,440
    Gen 2 GC Count / 60 sec                                0
    Gen 2 Size (B)                               210,807,272
    LOH Size (B)                                  74,140,000
    Monitor Lock Contention Count / 1 sec                  0
    Number of Active Timers                              314
    Number of Assemblies Loaded                          272
    ThreadPool Completed Work Item Count / 1 sec          38
    ThreadPool Queue Length                                0
    ThreadPool Thread Count                                9
    Working Set (MB)                                     242

一些有用的链接:

https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-counters https://www.youtube.com/watch?v=jn54CjePzs0

答案 1 :(得分:1)

我还没有找到一种方法来获取线程池中等待执行的任务数。

但是我找到了一种监视ThreadPool运行状况的方法:

我创建了一个全局计时器(假设每5秒钟一次),然后测量上一个“经过”的延迟:  由于Microsoft .NET Timers是在ThreadPool中执行的,因此如果延迟异常(例如7秒)是异常的,我知道Elapsed必须等待很多时间,所以ThreadPool已饱和。