PerThreadLifetimeManager в Unity

2

В документации Unity PerThreadLifetimeManager я прочитал: "Этот менеджер времени жизни не распоряжается экземплярами, которые он держит". Ref.: http://msdn.microsoft.com/en-us/library/ff647854.aspx

Итак, если я использую ThreadPool, означает ли это, что объекты, разрешенные с использованием Unity в потоке ThreadPool, не будут удаляться в конце работы, выполненной в этом потоке, прежде чем возвращаться в пул?

Любой шаблон или идеи, как я могу гарантировать, что объекты будут удалены, и я получаю чистый поток из пула потоков?

Спасибо!

Теги:
unity-container
threadpool

1 ответ

2
Лучший ответ

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

Похоже, вы хотите TransientLifetimeManager, который предоставляет новый экземпляр для каждого звонка. Вы можете вызвать Resolve внутри рабочего потока, использовать экземпляр и удалить его до выхода метода.

Я не уверен, что вы могли бы создать менеджер по жизни, который каким-то образом автоматически узнал, что ваш поток завершил выполнение. Лучший способ убедиться, что это произойдет, - создать оболочку метода, которая 1) получает экземпляр из Unity (используя TransientLifetimeManager), выполняет Action <T> (ваш фактический рабочий метод), проходящий в экземпляре, а затем удаляет этот экземпляр перед выходом. Затем вы выполнили бы свой код, передав его этой оболочке, которая запускается в рабочем потоке. Вам нужно будет написать код Resolve() и Dispose() один раз и повторно использовать его везде.

  • 1
    большое спасибо за ваш ответ. Я ищу поведение PerThreadLifetime, где я получаю новый экземпляр для каждого потока, но хочу избавиться от объекта, когда метод завершен и поток возвращается в ThreadPool. Есть идеи, как это может работать с Unity?
  • 0
    @dorian Я дал вам то, что может быть единственным реалистичным способом сделать это. Как контейнер мог узнать, что ваш метод завершил выполнение? Единственный разумный дизайн - вы получаете экземпляр и утилизируете его до выхода из потока. Вам понадобится магия любым другим способом.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню