Задачи против пула потоков

#c# #multithreading #parallel-processing #task-parallel-library

#c# #многопоточность #параллельная обработка #задача-параллельная-библиотека

Вопрос:

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

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

Комментарии:

1. Вы абсолютно уверены, что вам нужно контролировать количество запущенных потоков? Или вам просто нужно контролировать количество выполняемых частей работы?

Ответ №1:

Пожалуйста, взгляните на ParallelOptions.Максимальная степень параллелизма для Task s.

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

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

Ответ №2:

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

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

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

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

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

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

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

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

Ответ №3:

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

Ответ №4:

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

Статья MSDN о классе Semaphore