Задачи против ThreadPool - PullRequest
9 голосов
/ 10 ноября 2011

У меня есть приложение на C # со списком работы. Я собираюсь выполнять как можно больше этой работы параллельно. Однако мне нужно иметь возможность контролировать максимальное количество параллельных задач.

Насколько я понимаю, это возможно с ThreadPool или с Задачами. Есть ли разница в том, какой я использую? Моя главная задача - возможность контролировать количество активных потоков за один раз.

Ответы [ 5 ]

20 голосов
/ 10 ноября 2011

Пожалуйста, посмотрите на ParallelOptions.MaxDegreeOfParallelism для Task с.

Я бы посоветовал вам использовать Задачи, потому что они обеспечивают абстракцию более высокого уровня, чем ThreadPool.

Очень хорошее прочтение по теме можно найти здесь . Действительно, обязательная книга, и она бесплатна:)

5 голосов
/ 10 ноября 2011

В TPL вы можете использовать WithDegreeOfParallelism на ParallelEnumerable или ParallelOptions.MaxDegreeOfParallism

Существует также CountdownEvent, который может быть лучшим вариантом, если вы просто используете пользовательские потоки или задачи.

В ThreadPool, когда вы используете SetMaxThreads, это глобально для AppDomain, поэтомупотенциально вы могли бы излишне ограничивать несвязанный код.

Нельзя установить число рабочих потоков или число потоков завершения ввода-вывода, которое будет меньше числа процессоров в компьютере.

Если общеязыковая среда выполнения размещается, например, в Internet Information Services (IIS) или SQL Server, хост может ограничивать или предотвращать изменения размера пула потоков.

Будьте осторожны при изменении максимальногоколичество потоков в пуле потоков.Хотя ваш код может принести пользу, изменения могут отрицательно повлиять на используемые вами библиотеки кода.

Слишком большой размер пула потоков может вызвать проблемы с производительностью.Если одновременно выполняется слишком много потоков, издержки на переключение задач становятся существенным фактором.

Я согласен с другим ответом, что вы должны использовать TPL поверх ThreadPool, поскольку это лучшая абстракциямногопоточности, но можно добиться того, что вы хотите в обоих.

3 голосов
/ 10 ноября 2011

Задача имеет очень очаровательную особенность для меня, вы можете создавать цепочки задач. Которые выполняются по определенным результатам задачи раньше. Функция, которую я часто использую, заключается в следующем: Задача A выполняется в фоновом режиме, чтобы выполнить долгую работу. После этого я чередую задачу B, выполняя ее только после завершения задачи A, и настраиваю ее для выполнения на переднем плане, чтобы я мог легко обновить свои элементы управления в результате длительного выполнения задачи A.

3 голосов
/ 10 ноября 2011

В этой статье о msdn они объясняют, почему они рекомендуют Задачи вместо ThreadPool для Параллелизма.

2 голосов
/ 10 ноября 2011

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

MSDN Статья о семафорном классе

-Уэсли

...