В основном вам нужен пул процессоров в зависимости от типа. Вместо кэширования реального процессора в словаре процессоров создайте класс пула, который отслеживает доступные и активные процессоры. Когда приходит запрос, найдите соответствующий пул. Затем посмотрите, есть ли доступные процессоры. Если так, выньте это из доступного списка и поместите это в активный список. Запустите метод Process, затем удалите его из активного списка и поместите в доступный список.
Вы можете избежать использования активных / доступных списков и просто использовать вместо них активный флаг. В зависимости от количества одновременных процессов это может быть более эффективным.
Однако, если каждый вызов процесса занимает только миллисекунду, это звучит как излишнее для ваших конкретных нужд. Я бы порекомендовал использовать lock () для синхронизации и добавить некоторые записи в журнал, чтобы увидеть, как часто процессы ожидают блокировки. Если при тестировании вы обнаружите, что это проблема, тогда приступайте к чему-то более сложному.
Вам также, вероятно, нужно заблокировать доступ к словарю processors
, если он уже не является потокобезопасным. Если словарь предварительно загружен на 100%, в этом нет необходимости.