什么是Appdomain回收

时间:2020-03-05 18:45:52  来源:igfitidea点击:

我试图弄清楚Appdomain回收到底是什么?
当我第一次从DotNet应用程序请求一个aspx页面时,我了解到已为该应用程序创建了一个appdomain,并将所需的程序集加载到了该appdomain中,并且将处理该请求。
现在,如果修改了web.config文件或者bin文件夹的内容等,则appdomain将被"回收"。
我的问题是,在回收过程结束时,appdomain会加载程序集并准备服务下一个请求吗?还是需要一个页面来触发程序集加载?

解决方案

回答

看一下可能解释它的内容:

http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-2D00-AppDomain-recycles_2C00_-more-common-than-before-aspx#440333

一般来说。由于编译和创建AppDomain,在ASP.NET网站上所谓的"首次点击"通常会花费较长的时间。

每当我们部署网站时,请确保使用Visual Studio中的"发布网站"功能来预编译网站。然后减少了"首次命中"的惩罚。并记住将配置设置为Release,而不是Debug!

回答

如果页面是"可更新的",则必须在使用前对其进行编译。这意味着,是的,在第一次请求时,程序集就被加载,编译并准备好进行访问。只要更改了这些文件(甚至某些病毒软件都可以通过更改文件的修改日期来触发此操作!),appdomain就会被回收。

我们可以将Web应用程序配置为不可更新。一切都被编译为DLL,并且在虚拟目录中我们将看不到任何.ASPX或者.CS文件。它使代码难以更新(需要在网页上添加一些其他文本?重新编译!),但是它增加了Web应用程序的可用性。

但是,如果任何文件被更改,这仍然不会阻止Web应用程序被回收。例如,如果我们编辑web.config,则即使应用程序域已编译,它也将回收。

回答

回收会关闭托管appdomain的进程。我们会注意到,PID在回收时会发生变化。

卸载AppDomin只是卸载AppDomain中的所有程序集,然后可以重用它们。

要记住的重要一点是,一旦将CLR加载到进程中,就无法将其删除。因此,如果我们需要在CLR加载后立即执行某项操作,那么简单地卸载AppDomain就无济于事,因为不会重新加载CLR。

同样不是说IIS不是唯一可以承载AppDomain的进程,任何进程都可以,并且我们并不总是希望仅仅为了卸载程序集而杀死整个进程。