Joh*_*ith 23 c# queue multithreading 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();
}
Run Code Online (Sandbox Code Playgroud)
小智 18
ThreadPool.SetMaxThreads(5, 5)
意味着活动线程的数量是5(如果你有超过5个cpu核心),并不意味着ThreadPool只能创建5个线程.ThreadPool最大线程数= CPU Core*250.
之后Thread.Sleep,线程处于非活动状态,因此不会影响其他线程的执行.
| 归档时间: |
|
| 查看次数: |
44628 次 |
| 最近记录: |