2009-10-16 5 views
5

У меня есть несколько задач с низким значением, которые необходимо выполнить, когда доступно некоторое время процессора. Я не хочу, чтобы эта задача выполнялась, если выполнялась другая задача импорта. Т.е., если приходит задача с нормальным/высоким приоритетом, я хочу, чтобы задача с низким значением приостанавливалась до тех пор, пока не будет выполнена важная задача.Приоритет нижней нити C# в пуле потоков

Существует довольно большое количество задач с низкой значимостью (от 50 до 1000). Поэтому я не хочу создавать один поток для каждой задачи. Однако я считаю, что threadpool не разрешает некоторую приоритетную спецификацию, не так ли?

Как вы это решите?

ответ

2

Вы можете создать новую тему и использовать Dispatcher, чтобы отправить ее various priorities.

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

2

Не следует путаться с приоритетом ThreadPool, так как вы не единственный потребитель. Я полагаю, что логический подход заключался бы в том, чтобы написать свой собственный - возможно, так же просто, как очередь производителей/потребителей, используя ваши собственные Thread (ы) в качестве потребителя (ов) - самостоятельно определяя приоритет потока.

.NET 4.0 включает в себя новые библиотеки (TPL и т. Д.), Чтобы сделать все это проще - до этого вам понадобится дополнительный код для создания настраиваемого пула потоков или рабочей очереди.

+0

Фокус в том, что я не хочу начинать задания с учетом их приоритетов, я хочу, чтобы они выполнялись с учетом их предвзятости. (то есть задача с низким приоритетом должна приостанавливаться, если выполняется высокий приоритет) – Toto

+0

NB: Я использую 3.5 framework – Toto

+0

Тогда вам придется искать «очередь приоритетов C#» - их много, но я могу " t прямо рекомендую какой-либо конкретный. Я * подозреваю * TPL предложит это прямо после выпуска. –

2

При использовании сборки в ThreadPool все потоки выполняются с приоритетом по умолчанию. Если вы испортите этот параметр, он будет проигнорирован. Это случай, когда вы должны перевернуть свой собственный ThreadPool. Несколько лет назад я расширил SmartThreadPool, чтобы удовлетворить мои потребности. Это может удовлетворить ваши потребности.

0

Я бы создал общую очередь ожидающих объектов задачи с каждым объектом, определяющим его приоритет. Затем напишите поток диспетчера, который следит за очередью и запускает новый поток для каждой задачи, вплоть до некоторого максимального предела потока, и указывая приоритет потока, когда он его создает. Это всего лишь небольшая работа для этого, и вы можете иметь активность отчета диспетчера и даже динамически корректировать количество запущенных потоков. Эта концепция очень хорошо работала для меня и может быть завершена в службу Windows для загрузки, если вы сделаете свою очередь таблицей базы данных.