c# - 使用线程池的正确方法是什么?

标签 c# multithreading queue threadpool

如果我对 ThreadPool 工作方式的理解是正确的,那么它的目的之一是限制在给定时间可以创建的进程中的工作线程数。例如,如果将 MaxThreads 设置为 5,然后调用 QueueUserWorkItem 30 次,将向 ThreadPool 发出 30 个请求,但其中只有 5 个请求将由新线程提供服务,而其他 25 个请求将添加到队列中并在先前的请求完成并且现有线程可用时一次为一个服务。

然而,在下面的代码中,对 Thread.Sleep(-1) 的调用保证了 DoSomething() 方法永远不会返回,这意味着当前线程永远不会对后续请求可用。

但我对 ThreadPool 工作方式的理解不可能是正确的,因为如果它是正确的,下面的代码将只打印数字 0-4,而不是 0-29。

谁能解释一下 ThreadPool 是如何工作的,以及为什么下面的代码没有按照我认为应该做的去做?

    static void DoSomething(object n)
    {
        Console.WriteLine(n);
        Thread.Sleep(-1);
    }

    static void Main(string[] args)
    {
        ThreadPool.SetMaxThreads(5, 5);
        for (int x = 0; x < 30; x++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x);
        }
        Console.Read();
    }

最佳答案

ThreadPool.SetMaxThreads(5, 5)

表示事件线程数为5(如果你有5个以上cpu核心),并不意味着ThreadPool只能创建5个线程。 ThreadPool 最大线程数 = CPU Core * 250。

Thread.Sleep后,线程处于非事件状态,不会影响其他线程的执行。

关于c# - 使用线程池的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14515207/

相关文章:

java - Queue#offer() 应该优先于 Queue#add() 吗?为什么?

c# - 数组和可空类型是否可以在声明之前使用?

c# - 找到类型实现所需的所有程序集以成功编译

c# - Nullable<T> 与类似的自定义 C# 结构有何不同?

java - System.out 和 .err - 回到 future ?

java - 多线程应用程序中的单独日志文件

ruby - 如何在Ruby中按顺序执行线程

queue - 替换 jms 队列中的消息

c# - typeof() 时 无法将类型 'System.Type' 隐式转换为 'string'

asynchronous - swift 3 : Why is OS_dispatch_queue_serial the default queue?