.Net Framework认知
在托管代码的世界里,应用程序首先被加载到应用程序域(AppDomain)中,然后将应用程序域加载到进程中,一个进程可以包含多个应用程序域,也就是说一个进程可以包含多个应用程序,毕竟应用程序域之间的切换比进程间的切换要轻便。
在应用程序域之间的数据时相互独立的,当需要在其他AppDomain当中执行当前AppDomain中的程序集代码时,可以使用CrossAppDomainDelegate委托。把CrocessAppDomainDelegate委托绑定方法以后,通过AppDomain的DoCallBack方法即可执行委托。
class Program { static void Main(string[] args) { Console.WriteLine("主程序域开始运行"); //建立新的应用程序域对象 AppDomain newAppDomain = AppDomain.CreateDomain("子程序域"); //绑定CrossAppDomainDelegate的委托方法 CrossAppDomainDelegate crossAppDomainDelegate = new CrossAppDomainDelegate(MyCallBack); //子应用程序域调用委托,相当于子程序域调用主程序域里的方法 newAppDomain.DoCallBack(crossAppDomainDelegate); //绑定程序域卸载事件处理方法 newAppDomain.DomainUnload += (obj, e) => { Console.WriteLine("子程序域卸载!"); }; //卸载子程序域 AppDomain.Unload(newAppDomain); Console.ReadKey(); } static public void MyCallBack() { string name = AppDomain.CurrentDomain.FriendlyName; for (int n = 0; n < 4; n++) { Console.WriteLine(string.Format("当前程序运行于{0}",name)); } } }
一个进程可以包含多个线程,线程存在于进程当中,它在不同的时刻可以运行于多个不同的AppDomain当中。它是进程中的基本执行单元 ,在进程入口执行的第一个线程被视为这个进程的主线程。在.Net应用程序中,都是以Main()方法作为入口的,当调用此方法时,系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。