DotNet App Domain - app域是否提供了多个进程的相同优势?

时间:2013-12-12 08:50:24

标签: c# .net appdomain

在我们的服务器中,我们正在加载第三方程序集,它会创建自己的资源,如内存和线程。我们需要创建这个第三方插件的多个实例,并且随着实例数量的增加,我们服务器的内存和线程都会达到极限。

一种方法是将这个插件加载到不同的exes中,从而释放服务器资源。这将起作用,因为每个进程都将从其自己的资源池中获益。

问题是,如果我们使用AppDomain并隔离插件,它会提供类似于在资源可用性方面在不同进程中托管它的优势。

谢谢, 中号...

2 个答案:

答案 0 :(得分:2)

我的经验是,流程比AppDomains更灵活,更稳定。与进程相比,AppDomain存在一些致命的限制:

  1. 如果在AppDomain中创建了线程,则主机不知道新线程
  2. 如果在AppDomain中创建了线程,并且在新线程中抛出了未处理的异常,则整个进程将被终止(托管第三方组件时这是一个灾难)
  3. 如果AppDomain包含非托管代码,则无法正确卸载
  4. 即使AppDomain只包含托管代码,您仍可能无法卸载它或中止线程(例如finally块中的死循环),而进程很容易被杀死

答案 1 :(得分:2)

AppDomain不享受操作系统提供的新“资源空间”。例如,在创建新的AppDomain时,可用内存空间不会扩大,这可能是对32位系统的限制。出于同样的原因,导致进程死亡的错误(如内存不足)将导致进程中的所有AppDomain一起死亡,因此未捕获的异常也是如此。使用进程时,这是绝对错误的。

然而,.NET确实将AppDomain作为外国单位处理。例如,对每个AppDomain执行垃圾收集,因此AppDomain的一个GC线程不会干扰不同的AppDomain。它可能会通过降低AppDomains之间的依赖关系来影响AppDomains消耗的CPU时间资源(尽管我从未试图检查它对它的影响程度)。

从您的问题来看,听起来过程是首选解决方案,因为您希望每个插件都有不同的资源池,但答案取决于您所谈论的资源类型。