2008-12-02 2 views
1

Я только что обнаружил, что если генерировать сборки через Reflection.Emit, .NET framework сохраняет ссылки в статическом члене, который запрещает классы Reflection.Emit не быть GC'ed.Как быстро создается AppDomain?

Я не могу использовать DynamicMethod из-за ограничений. Я также генерирую много сборок (инкрементный компилятор IronScheme) в течение программы (может быть 1000+).

Следовательно, я думал просто обработать генерирование кода в отдельном домене и выгрузить его позже (не решил, как с этим справиться).

Есть ли у кого-нибудь опыт, насколько это дорого будет?

ответ

1

Как я понимаю, это немного медленнее, чем порождение нити.


Проведено некоторое исследование, пытаясь найти настоящую ссылку для этого. До сих пор, это лучшее, что я могу придумать:
http://msdn.microsoft.com/en-us/library/aa159887.aspx

около 2/3 пути вниз он называет создание AppDomains «дорого», но тогда вы можете сказать то же самое о потоках в определенном contexts- это действительно зависит от того, что делает конкретный поток при создании.

снова: это мое понимание того, что AppDomain существу нить (или несколько потоков) в рамках процесса — логическим разделителем, если вы — таким образом, что во время выполнения гарантирует некоторые дополнительные средства защиты в том, что предотвратить отдельные AppDomains от вмешательства друг в друга. Чтобы создать новый AppDomain в существующем процессе (приложении), фреймворк должен выполнить всю работу, связанную с созданием нового потока, а также дополнительные дополнительные накладные расходы, чтобы настроить его в остальной части приложения (что также может включать загрузку одного или нескольких сборки в память). В конце концов, AppDomain живет где-то между потоком и процессом.

+0

Это было бы хорошей новостью! Я только что обнаружил у него больше ссылок, это действительно испортило GC :) – leppie 2008-12-02 18:25:01

2

Я бы оценил его для вашего конкретного случая.

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

Смежные вопросы