.Net Как создать собственный поток ThreadPool, общий для всех доменов приложения процесса? - PullRequest
4 голосов
/ 17 ноября 2009

Я создал пользовательский ThreadPool, оптимизированный для моих конкретных потребностей. Тем не менее, когда в процессе находится несколько доменов приложений, CLR ThreadPool может быть общим для всех доменов приложений, и я хотел бы иметь возможность воспроизвести это поведение.

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

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

Итак, мои вопросы:

  1. Есть ли способ сделать кастом пул потоков с использованием удаленного взаимодействия с минимальные накладные расходы?
  2. Если нет, не так ли можно поделиться неуправляемым объект через AppDomain?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Создайте новый экземпляр пула потоков в каждом домене приложения, но затем используйте семафор для управления общим числом потоков, запущенных во всех экземплярах. Это означает, что вы все равно можете обрабатывать одинаковое количество одновременных заданий, но не теряете времени на маршаллинг.

В документации MSDN есть пример.

0 голосов
/ 19 ноября 2009

Подумав больше об этом, вероятно, будет плохой идеей попытаться переопределить весь процесс ThreadPool, CLR ThreadPool уже оптимизирован для этого.

В моем случае я хотел больше гибкости, чтобы иметь возможность определять приоритеты рабочих элементов, помещенных в очередь в пуле, это можно сделать с помощью слоя, созданного поверх существующего CLR ThreadPool.

...