1

我刚刚发现,如果通过 Reflection.Emit 生成程序集,.NET 框架会将引用保存在一个静态成员中,以防止 Reflection.Emit 类不被 GC'ed。

由于限制,我无法使用 DynamicMethod。我还在程序过程中生成了很多程序集(IronScheme 的增量编译器)(可能是 1000+)。

因此,我想只在一个单独的域中处理代码生成,然后再将其卸载(尚未决定如何处理)。

有没有人有任何经验这会有多贵?

4

2 回答 2

2

我会根据您的具体情况对其进行基准测试。

如果结果很昂贵,只需预先创建一些,然后根据需要使用并在后台重新创建新的,以确保您始终有足够的未使用的等待(有点像线程池,但您重新创建它们每次释放内存)。

于 2009-07-10T15:37:48.220 回答
1

据我了解,它只是比产生一个线程慢一点。


一直在做一些研究,试图找到一个真正的参考。到目前为止,这是我能想到的最好的:http:
//msdn.microsoft.com/en-us/library/aa159887.aspx

大约有 2/3 的方法称创建 AppDomains “昂贵”,但是您可能会在某些上下文中对线程说同样的话——这实际上取决于特定线程在创建时所做的事情。

再说一遍:我的理解是,AppDomain 本质上是一个进程中的一个线程(或多个线程)——一个逻辑分隔符,如果你愿意的话——这样运行时保证某些额外的保护是有效的,可以防止单独的 AppDomain 干扰每个其他。要在现有进程(应用程序)中创建新的 AppDomain,框架必须完成与创建新线程相关的所有工作,以及在应用程序的其余部分中设置它的一些额外开销(可能还涉及加载一个或多个汇编到内存中)。最后,AppDomain 位于线程和进程之间。

于 2008-12-02T18:18:38.230 回答