2015-03-07 1 views
-1

Я начинаю темы точно, как говорится в книге:Почему ThreadPool запускает только один поток во времени?

for (int i = 1; i <= 4; i++) { 
    ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i); 
} 

ThreadMethod выглядит следующим образом:

static void ThreadMethod(object input) { 
    Console.WriteLine(input + " thread started"); 
    //do some stuff for, like, 400 milliseconds 
    Console.WriteLine(input + " thread completed"); 
} 

В какой-то причине 2 нити начинается только после того, как 1 завершена (в этот момент вся работа уже сделана и 2 -4 нить только начинается и перестает ничего делать).

Что может быть неправильным? Спросите все, что может помочь решить эту проблему. Я не использую никаких классов синхронизации.

Если это имеет значение, у меня есть 2 основных процессора.

+1

Вы пытаетесь сделать потоки более длительным периодом времени (поместите пример Thread.Sleep() для примера), чтобы устранить проблему. –

+0

Прослушать исполняемый код, чтобы мы могли видеть, что вы имеете в виду и воспроизводите. – usr

+1

Пул потоков работает так же, как ваш мозг. Когда ваш босс одновременно дает вам 4 новых задания, вы также не работаете со всеми 4 одновременно. Вы закончите один, прежде чем переходить на другой. Если это займет слишком много времени, чтобы завершить его, вы можете быть вынуждены начать еще одно раньше, чтобы оно не задерживалось слишком долго. –

ответ

0

На самом деле, поскольку я создал ThreadMethod для создания гораздо более продолжительного материала, через некоторое время начались другие потоки, но он не работал за один раз, а просто переключился с потока на поток. Похоже, я должен использовать другой инструмент.

+1

«просто переключается с темы на нить» - почему вы так думаете? – aush

+0

Возможно, я не уверен в этом. Мне нужно закончить этот проект и правильно отдохнуть. Прямо сейчас я измучен мысленно. – D4C

2

Ваш ThreadMethod просто работает слишком быстро. Все правильно с вашим кодом, за исключением случаев, когда вам следует переключиться с ThreadPool на новые абстракции, такие как Task.Run.

0

TreadPool имеет максимальное количество потоков, которое он может использовать. См. ThreadPool.GetMaxThread и SetMaxThread. Вероятно, он равен количеству доступных ядер по умолчанию.

Для интенсивной работы с ЦП это имеет смысл, поскольку вы фактически снижаете производительность, используя больше потоков, чем у вас есть ядра. Однако для медленных заданий, таких как интенсивные задания ввода-вывода, многие потоки могут запускаться параллельно, чтобы избежать блокировки и ждать завершения ввода-вывода. Пример: сбор нескольких файлов за раз с разных FTP-серверов.

Смежные вопросы