Если мое понимание того, как работает ThreadPool, является правильным, одна из его целей - ограничить количество рабочих потоков в процессе, который может быть создан в данный момент времени. Например, если вы установите MaxThreads на 5, а затем вызовите QueueUserWorkItem 30 раз, 30 запросов будут отправлены в ThreadPool, но только 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();
}