2013-05-09 2 views
2

Я относительно новичок в параллельном программировании и вам нужно запустить фоновый процесс на разных потоках..NET Многопоточный фоновый процесс с ограничением потока?

Сценарий - это приведет к тому, что первый фоновый процесс будет запущен - для завершения может потребоваться до 45 секунд (например). Между тем, в какой-то произвольный момент после запуска первого фонового процесса происходит другое событие, которое, в свою очередь, вызывает запуск второго фонового процесса - скажем, 20 секунд. Я не хочу ждать еще 25 секунд для завершения первого процесса, я хотите, чтобы этот второй процесс работал сразу в другом потоке. Но я также хочу ограничить количество потоков, которые можно отменить.

Нужно ли создать какой-то класс очередей с объектами BackgroundWorker или аналогичными? Каким будет наилучший подход для этого сценария?

ответ

2

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

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

Для получения дополнительной информации о TaskScheduler вообще Престола: http://msdn.microsoft.com/en-us/library/dd997402.aspx

Если вы уверены, что вам нужно ограничить количество потоков, вы можете расширить класс TaskScheduler: http://msdn.microsoft.com/en-us/library/ee789351.aspx

+0

Обратите внимание, что пулы потоков специально предназначенные для краткосрочных операций; то, что занимает 45 секунд для запуска, действительно не должно быть помещено в пул потоков. – Servy

+0

Для задач, которые, как вы знаете, займут много времени, вы можете использовать флаг TaskCreationOptions.LongRunning (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcreationoptions.aspx), чтобы сообщить TaskScheduler не увеличивать количество потоков в пуле потоков из-за этой задачи. По моему опыту, хотя я, вероятно, не буду считать 45 секунд долгой задачей, особенно если это верхний предел того, как долго будут выполняться ваши задачи. –

+1

Текущая реализация всегда будет создавать новый поток, а не использовать пул потоков, если указан параметр «LongRunning». (Конечно, это связано с изменением курса.) Идея состоит в том, что для коротких задач накладные расходы на создание нового потока велики по сравнению с самой задачей, что значительно снижает пропускную способность. В этом случае задача 20-45 секунд намного больше, чем время, затрачиваемое на создание нового потока, что не является особенно значительным накладным расходами, поэтому использование пула потоков в порядке. – Servy

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