Как я понял, ваше требование - запустить как можно больше потоков, чтобы оптимизировать использование ЦП. И в то же время, когда вы хотите, чтобы инфраструктура позаботилась об этой ответственности, чтобы увеличить и уменьшить текущие текущие потоки в зависимости от использования ЦП.
Я бы сказал, что TPL (Tasks) будет лучшим вариантом. Пожалуйста, ознакомьтесь с http://msdn.microsoft.com/en-us/library/dd537609.aspx
Мы поможем вам больше, если вы разделяете характер своей работы, которую вы хотите выполнять параллельно. Что именно вы подразумеваете под 248 работающими задачами? Какую работу выполняют ваши задачи? Является ли это вычислением или IO (операция БД/Веб-служба)?
Я предполагаю, что каждый запрос состоит из 4 шагов, и эти шаги выполняются в следующей последовательности, 1. DB просмотровых 2. Веб-служба вызова 3. Обновление БД 4. Войдите в меню Файл
Как вы упомянули, вызов веб-службы требует времени и, следовательно, лучше всего подходит для асинхронной задачи ввода-вывода.
Далее вы сказали,
ресурсоемкой часть будет дб поиск
Но я понимаю, что дб поиск не использует CPU и это деятельность I/O и снова хороший кандидат для асинхронной задачи ввода-вывода.
Учитывая все эти предположения я предлагаю следующие,
- DB Посмотрите вверх (Run асинхронно, так что поток пул потоков будет освобожден для обработки других запросов)
- веб-службы вызова (Запуск асинхронно так, что нить пул потоков будет освобожден для обработки других запросов)
- DB Update (Выполнить синхронно)
- Вход в меню Файл (асинхронное протоколирование в зависимости от размера содержимого журнала)
По моему мнению, ни один из ваших шагов не требует интенсивного процессора, поэтому вы видите только 5% от использования ЦП.
Вы также упоминали,
с последующим случайной задержкой, чтобы равномерно распределить нагрузку.
Возможно, вы имели в виду как можно больше таких запросов (состоит из этих 4 шагов)? Если это так, вам не нужно добавлять лишние вещи. Поскольку, когда запрос ожидает асинхронного вызова, он освобождает поток пула потоков, и система может использовать его для обработки другого запроса. Это увеличит пропускную способность.
Должен ли я сохранять задание в каждом классе или должен ли я наследовать свой бот от Задание?
1 Bot представляют 1 запрос. Задачи представляют собой шаги в рамках запроса. Поэтому создавайте задачи в своем классе BOT.
Запустите его с различным количеством запросов и проверьте использование CPU, Memory и других системных ресурсов.
Почему бы не остаться с нитками? – CodesInChaos
Поскольку время обработки всего 5%, с Task должно быть лучше. Я также смотрю, как работает по меньшей мере 100 потоков, что не рекомендуется. Я полагаю, что – faulty
Использование задачи не будет волшебно решить вашу проблему. Вам нужно будет использовать функции, такие как продолжения, чтобы воспользоваться задачами. – CodesInChaos