ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程应用程序域(七)...
閱讀目錄
一:應(yīng)用程序域概述
二:應(yīng)用程序域和線程的關(guān)系
三:線程跨越多個(gè)應(yīng)用程序域?qū)嵗?/span>
四:運(yùn)行效果
一:應(yīng)用程序域
. 在.NET中有個(gè)特點(diǎn),在.NET中有個(gè)CLR,在操作系統(tǒng)和我們編程環(huán)境之間有個(gè)CLR,操作系統(tǒng)和CLR之間有種隔離,操作系統(tǒng)和運(yùn)行庫(kù)會(huì)在應(yīng)用程序間提供某種隔離,為了確保一個(gè)應(yīng)用程序的代碼不會(huì)對(duì)其他不相關(guān)的應(yīng)用程序產(chǎn)生影響,這種隔離是必須的
. .NET中新增了一個(gè)隔離層稱為應(yīng)用程序域,它是進(jìn)程內(nèi)部一個(gè)邏輯獨(dú)立的部分,也就是說(shuō)兩個(gè)進(jìn)程之間為了讓它們不產(chǎn)生一些安全性的問(wèn)題,一個(gè)應(yīng)用程序出現(xiàn)錯(cuò)誤,不會(huì)影響其他的應(yīng)用程序,舉個(gè)例子:在Windows下經(jīng)常有某個(gè)應(yīng)用程序出錯(cuò)了,會(huì)彈出一個(gè)框問(wèn)是否要調(diào)試,在任務(wù)欄下把出錯(cuò)的這個(gè)應(yīng)用程序關(guān)閉就行了,說(shuō)明兩個(gè)進(jìn)程之間它們互相是不關(guān)聯(lián)的,是因?yàn)樗鼈冎g有應(yīng)用程序域的原因
. 公共語(yǔ)言運(yùn)行庫(kù)可以使用應(yīng)用程序域來(lái)提供應(yīng)用程序間的隔離
. 應(yīng)用程序域可以理解為我的地盤我做主,比如:只有一個(gè)道路的話,里面跑著大貨車,私家車,行人,那么大貨車出事故了是不必會(huì)影響到私家車和行人,同樣它們?nèi)齻€(gè)中任何一個(gè)出現(xiàn)問(wèn)題都會(huì)影響到其它的兩個(gè),因?yàn)樗鼈冊(cè)谝粋€(gè)道路里面,那么現(xiàn)在假設(shè)有三個(gè)車道,快車道跑大貨車的,慢車道跑私家小型車的,人行道走人的,如果大貨車出現(xiàn)事故了,是不就不會(huì)不影響到私家車和行人,那么大貨車在自己的道路里是不想怎么開就怎么開,倒著開都沒(méi)事,私家車和行人同理,因?yàn)樗鼈兪窃谌齻€(gè)不同的道路里,這里三個(gè)車道相當(dāng)于應(yīng)用程序域,大貨車和私家車以及行人相當(dāng)于三個(gè)進(jìn)程
. 使用應(yīng)用程序域
-能夠在不停止整個(gè)進(jìn)程的情況下,停止某一個(gè)應(yīng)用程序,一個(gè)進(jìn)程中包含好多應(yīng)用程序,可以把某個(gè)應(yīng)用程序停止,不影響其他的應(yīng)用程序
-在一個(gè)應(yīng)用程序中的代碼不能訪問(wèn)直接訪問(wèn)另外一個(gè)應(yīng)用程序中的代碼或資源
-代碼的行為范圍由它所運(yùn)行的所在應(yīng)用程序決定
-向代碼授予權(quán)限可以由代碼運(yùn)行所在的應(yīng)用程序域來(lái)決定
二:應(yīng)用程序域和線程的關(guān)系
. 在運(yùn)行時(shí),所有的托管代碼被加載到一個(gè)應(yīng)用程序域當(dāng)中,由特定的操作系統(tǒng)線程來(lái)運(yùn)行的
. 應(yīng)用程序域和線程之間不是一一對(duì)應(yīng)的,也就是說(shuō),一個(gè)應(yīng)用程序域可以執(zhí)行多個(gè)線程,一個(gè)線程可以跨越多個(gè)應(yīng)用程序域,但是在某個(gè)時(shí)間點(diǎn)上,某個(gè)線程還是在一個(gè)應(yīng)用程序域當(dāng)中的
. 通過(guò)調(diào)用Thread.GetDomain方法,可以確定線程執(zhí)行所在的域
? 三:線程跨越多個(gè)應(yīng)用程序域?qū)嵗?/strong>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace AppDomainAndThread
{
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? //創(chuàng)建一個(gè)應(yīng)用程序域
??????????? AppDomain appdomain = AppDomain.CreateDomain("MyAppDomain");
??????????? appdomain.SetData("DomainKey", "DomainValue");
??????????? CommonMethod();
??????????? //CrossAppDomainDelegate它是個(gè)委托,這個(gè)委托的作用是跨應(yīng)用程序域調(diào)用的,
??????????? CrossAppDomainDelegate mydelegate = new CrossAppDomainDelegate(CommonMethod);
??????????? //AppDomain的DoCallBack方法用于跨越應(yīng)用程序調(diào)用,在另外一個(gè)應(yīng)用程序域中執(zhí)行代碼也就是我們的輸出內(nèi)容
??????????? appdomain.DoCallBack(mydelegate);
??????????? Console.ReadKey();
??????? }
??????? /// <summary>
??????? ///?兩個(gè)應(yīng)用程序域都要調(diào)用的方法
??????? /// </summary>
??????? private static void CommonMethod()
??????? {
??????????? //獲得當(dāng)前的應(yīng)用程序域
??????????? AppDomain appdomain = AppDomain.CurrentDomain;
??????????? Console.WriteLine("應(yīng)用程序域它的值是:'" + appdomain.GetData("DomainKey") + "' 在'" + appdomain.FriendlyName.ToString() + "'中找到的,運(yùn)行的線程ID是:'" + AppDomain.GetCurrentThreadId().ToString() + "'");
??????? }
??? }
}
? 四:運(yùn)行效果
我們發(fā)現(xiàn)兩個(gè)應(yīng)用程序域分別是“AppDomainAndThread.vshost.exe”和“MyAppDomain”,它們兩個(gè)的ThreadID是一樣的都是5832,在兩個(gè)應(yīng)用程序域執(zhí)行的是同一個(gè)線程
轉(zhuǎn)載于:https://www.cnblogs.com/menglin2010/archive/2012/03/25/2413566.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程应用程序域(七)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: App Hub上传应用的状态说明
- 下一篇: ASP.NET MVC的生命周期与网址路