Каков наилучший способ регулирования многих экземпляров .NET Task? - PullRequest
5 голосов
/ 18 февраля 2011

Я создал большое количество экземпляров Task.Мне нужно запустить их все и подождать, пока все они завершатся.Проблема в том, что мне нужно убедиться, что между «запущено» и «выполнено» не более X задач в любой момент времени;задачи включают в себя звонки другим абонентам, которые имеют ограничение на количество одновременных звонков.Так как эти ограничения не основаны на моем оборудовании, я не могу полагаться на встроенное интеллектуальное регулирование;Мне нужно строго соблюдать ограничения.Я смог сделать это, увеличив задачи и уменьшив общую переменную потокобезопасным способом, но это кажется излишне громоздкимЕсть ли способ, который более встроен в API напрямую, или простой инструмент синхронизации, который мне не хватает?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Вы должны создать свой собственный планировщик задач, см. Как: создать планировщик задач, который ограничивает степень параллелизма

Редактировать: Для этого требуется больше кода, чем с семафором, но у меня есть ощущение, что это может работать лучше, потому что пул потоков, в котором выполняются задачи, не знает о вашем семафоре, а использование TaskScheduler воспроизводится их правила.

Редактировать 2: Одним из возможных недостатков использования семафора является то, что пул потоков может подумать, что ваша задача выполняет операции ввода-вывода и назначает их много за раз (чтобы они зависали и ждали, потому что им не нужен процессор). Используя TaskScheduler они будут запланированы точно тогда, когда есть место для них. Это определенно сохранит чистоту бассейна.

1 голос
/ 18 февраля 2011

Класс Semaphore может работать для вас: http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

На этой странице MSDN есть хороший пример, показывающий, как его использовать.

Также могут быть легкиевстроенные механизмы пула / синхронизации потоков, которые вы можете использовать для достижения той же цели, но Semaphore в основном предназначен для выполнения ваших задач.

...