我想知道线程池中活动线程(iocp 和 worker)的数量。我使用这种技术:
ThreadPool.GetAvailableThreads(out var workerAvailable, out var iocpAvailable);
ThreadPool.GetMinThreads(out var workerMin, out var iocpMin);
ThreadPool.GetMaxThreads(out var workerMax, out var iocpMax);
var total = Process.GetCurrentProcess().Threads.Count;
var workerCurrent = workerMax - workerAvailable;
var iocpCurrent = iocpMax - iocpAvailable;
var other = total - worker - iocp;
日志中有很奇怪的数字:8、3worker和iocp150个other线程。
我使用procdump工具进行了转储,并使用ClrMd(ClrThread.IsThreadpoolCompletionPort和ClrThread.IsThreadpoolWorker属性)对其进行了检查。最后我从转储中得到了不同的结果:99worker和 14 个iocp线程。
为什么第一种方法会返回如此奇怪的结果?
UPD:我想ThreadPool.GetAvailableThreads返回max minus currently active (not idle)线程。