AppDomain Unload一点提醒
初识AppDomain
AppDomain的地位与非托管环境中的进程概念类似:用于为应用提供一个独立的运行环境,用于定义边界,隔离,保护。
在DotNet环境中,AppDomain更加灵活,它用于管理程序集的加载与卸载。
最常用的有两个方法和一个属性,两个方法分别为:CreateDomain,Unload;一个属性:CurrentDomain。
下面主要说一下AppDomain.Unload
AppDomain Unload
1) AppDomain卸载后禁止引用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program { static void Main(string[] args) { AppDomain tempDomain = AppDomain.CreateDomain("New Temp Domain"); Console.WriteLine("NewTempDomain.Friend name is:" + tempDomain.FriendlyName); AppDomain.Unload(tempDomain); try { Console.WriteLine("Just check accessibility, Temp Domain is " + tempDomain == null ? "NULL" : "NOT NULL"); } catch(AppDomainUnloadedException adue) { Console.WriteLine("Access Excpetion:" + adue.Message); } Console.Read(); } }
输出的结果类似:
小结:一个AppDomain对象卸载之后,禁止引用,否则就会抛出一个 AppDomainUnloadedException
2) AppDomain卸载后访问与线程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
static void Main(string[] args) { //Thread Pool ThreadPool.QueueUserWorkItem(TryToAccessUnloadedAppDomain, "In Thread pool"); Thread.Sleep(1000); //BackGround Thread var newThread = new Thread(TryToAccessUnloadedAppDomain); newThread.IsBackground = true; newThread.Start("In Background Thread"); newThread.Join(); try { //Main thread TryToAccessUnloadedAppDomain("Main thread!"); } catch (AppDomainUnloadedException) { Console.WriteLine("AppDomainUnloadedException is caught!"); } Console.Read(); } static void TryToAccessUnloadedAppDomain( Object i_state ) { var tempDomain = AppDomain.CreateDomain("New Temp Domain"); Console.WriteLine("State:{0}, temp domain name {1}", i_state, tempDomain.FriendlyName ); AppDomain.Unload(tempDomain); Console.WriteLine("Code never displayed:" + tempDomain.FriendlyName); } }
输出结果:
结论:1)使用线程的方式,这种异常都会导致线程的终止,但是在非主线程中,线程都是安静的终止
2)在主线程中该异常不处理导致终止应用