Используя код из следующей статьи, я реализовал собственный ThreadPool:
http://www.developer.com/net/article.php/3783756
Вот чего я хочу добиться:
При запуске через таймер служба должна запрашивать базу данных каждые 5 секунд для выполнения новых заданий. Задание - это в основном только информация о программе командной строки, которую нужно запускать с аргументами.
Одновременно может выполняться до 50 или более из этих программ. Программа может быть запущена за пару секунд, минут, а также часов. Служба должна постоянно контролировать эти программы, то есть, например, она должна иметь возможность убивать программу по запросу.
Используя реализацию ThreadPool, описанную выше, я начал ставить в очередь программы, которые должны быть выполнены, и мог видеть, когда служба действительно их выполняла. Пока проблем нет. Однако механизм здесь работает так:
ThreadPool создает рабочий поток и запускает его. Всякий раз, когда программа ставится в очередь, рабочая нить замечает это и вызывает делегат, который по существу создает экземпляр объекта System.Diagnostics.Process и запускает внешнюю программу. Затем поток завершает свою работу и сможет запускать дальнейшие программы. Однако ... когда нет программы для запуска, таймер простоя заставляет потокового менеджера уничтожить поток и тем самым прервать запущенный процесс.
Это не то, что мне нужно. У кого-нибудь есть идея, как лучше описать сценарий, который я описал?