什么是Appdomain回收
我试图弄清楚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的进程,任何进程都可以,并且我们并不总是希望仅仅为了卸载程序集而杀死整个进程。