首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadPool - MaxThreads - AvailableThreads = CUrrent ThreadPool线程数吗?

ThreadPool - MaxThreads - AvailableThreads = CUrrent ThreadPool线程数吗?
EN

Stack Overflow用户
提问于 2019-06-05 01:12:55
回答 1查看 213关注 0票数 0

下面的代码会给我一个准确的ThreadPool线程运行数量吗?

代码语言:javascript
复制
ThreadPool.GetAvailableThreads(out var availableWorkerThreads, out var availableCompletionPortThreads);
ThreadPool.GetMaxThreads(out var maxWorkerThreads, out var maxCompletionPortThreads);

var currentWorkerThreads = maxWorkerThreads - availableWorkerThreads;
var currentCompletionPortThreads = maxCompletionPortThreads - availableCompletionPortThreads;

Console.WriteLine("Current Worker Threads: " + currentWorkerThreads)
Console.WriteLine("Current Completion Port Threads: " + currentCompletionPortThreads)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 01:12:55

看起来你确实可以用它来计算活动线程池线程的数量。

至少在.NET框架4.6.1上

测试

我已经编写了一个noddy控制台应用程序来测试这一点,通过调度一系列任务,并查看创建了多少线程。

您可以看到,在4之后,它会等待一段时间,然后才会创建其他线程。

输出

代码语言:javascript
复制
----  Start  ----  17:01:55.2583
ThreadPool.GetAvailableThreads: 2,047
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 0


----  After Scheduling 1  ----  17:01:55.2793
ThreadPool.GetAvailableThreads: 2,046
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 1


----  After Scheduling 50  ----  17:01:55.2803
ThreadPool.GetAvailableThreads: 2,043
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 4


----  After Scheduling 500  ----  17:01:55.2813
ThreadPool.GetAvailableThreads: 2,043
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 4


----  After Sleeping 30.00s  ----  17:02:25.3403
ThreadPool.GetAvailableThreads: 2,022
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 25


----  After Sleeping 30.00s  ----  17:02:55.3453
ThreadPool.GetAvailableThreads: 2,004
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 43

----  After Waiting for all 500  ----  17:03:25.3573
ThreadPool.GetAvailableThreads: 2,047
ThreadPool.GetMaxThreads: 2,047
ThreadPool.GetMinThreads: 4
ThreadPool.CurrentThreads: 0

代码

代码语言:javascript
复制
class Program
{
    private static readonly List<Task> _tasks = new List<Task>();

    static void Main(string[] args)
    {
        OutputThreadCount("Start");

        var millisecondsDelay = 5000;

        ScheduleTasks(1, millisecondsDelay);

        OutputThreadCount("After Scheduling 1");

        ScheduleTasks(50, millisecondsDelay);

        OutputThreadCount("After Scheduling 50");

        ScheduleTasks(500, millisecondsDelay);

        OutputThreadCount("After Scheduling 500");

        var all = Task.WhenAll(_tasks);

        while (!all.IsCompleted)
        {
            var millisecondsTimeout = TimeSpan.FromSeconds(30);
            Thread.Sleep(millisecondsTimeout);
            OutputThreadCount($"After Sleeping {millisecondsTimeout.TotalSeconds:N2}");
        }

        OutputThreadCount("After Waiting for all 500");


        Console.Read();
    }

    private static void ScheduleTasks(int taskCount, int millisecondsDelay)
    {
        for (int i = 0; i < taskCount; i++)
        {
            var task = Task.Run(() => Thread.Sleep(millisecondsDelay));

            _tasks.Add(task);
        }
    }

    private static void OutputThreadCount(string message)
    {
        Console.WriteLine();
        Console.WriteLine($"----  {message}  ----  {DateTime.UtcNow:HH:mm:ss.ffff}");

        ThreadPool.GetAvailableThreads(out var availableWorkerThreads, out var availableCompletionPortThreads);
        ThreadPool.GetMaxThreads(out var maxWorkerThreads, out var maxCompletionPortThreads);
        ThreadPool.GetMinThreads(out var minWorkerThreads, out var minCompletionPortThreads);

        Console.WriteLine($"ThreadPool.GetAvailableThreads: {availableWorkerThreads:N0}");
        Console.WriteLine($"ThreadPool.GetMaxThreads: {maxWorkerThreads:N0}");
        Console.WriteLine($"ThreadPool.GetMinThreads: {minWorkerThreads:N0}");
        Console.WriteLine($"ThreadPool.CurrentThreads: {maxWorkerThreads - availableWorkerThreads:N0}");
        Console.WriteLine();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56448518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档