引言
在河北等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),河北網(wǎng)站建設(shè)費(fèi)用合理。
本文主要是介紹進(jìn)程(Process)、應(yīng)用程序域(AppDomain)、.NET上下文(Context)的概念與操作。
雖然在一般的開發(fā)當(dāng)中這三者并不常用,但熟悉三者的關(guān)系,深入了解其作用,對提高系統(tǒng)的性能有莫大的幫助。
在本篇最后的一節(jié)當(dāng)中將會介紹到三者與線程之間的關(guān)系,希望對多線程開發(fā)人員能提供一定的幫助。
因?yàn)闀r(shí)間倉促,文中有錯(cuò)誤的地方敬請點(diǎn)評。
目錄
一、進(jìn)程的概念與作用
二、應(yīng)用程序域
三、深入了解.NET上下文
四、進(jìn)程應(yīng)用程序域與線程的關(guān)系
一、進(jìn)程的概念與作用
進(jìn)程(Process)是Windows系統(tǒng)中的一個(gè)基本概念,它包含著一個(gè)運(yùn)行程序所需要的資源。進(jìn)程之間是相對獨(dú)立的,一個(gè)進(jìn)程無法直接訪問另 一個(gè)進(jìn)程的數(shù)據(jù)(除非利用分布式計(jì)算方式),一個(gè)進(jìn)程運(yùn)行的失敗也不會影響其他進(jìn)程的運(yùn)行,Windows系統(tǒng)就是利用進(jìn)程把工作劃分為多個(gè)獨(dú)立的區(qū)域 的。進(jìn)程可以理解為一個(gè)程序的基本邊界。
1.1 Process 的屬性與方法
在 System.Diagnostics 命名空間當(dāng)中存在Process類,專門用于管理進(jìn)程的開始、結(jié)束,訪問進(jìn)程中的模塊,獲取進(jìn)程中的線程,設(shè)定進(jìn)程的優(yōu)先級別等。
表1.0 顯示了Process類的常用屬性:
屬性 | 說明 |
BasePriority | 獲取關(guān)聯(lián)進(jìn)程的基本優(yōu)先級。 |
ExitCode | 獲取關(guān)聯(lián)進(jìn)程終止時(shí)指定的值。 |
ExitTime | 獲取關(guān)聯(lián)進(jìn)程退出的時(shí)間。 |
Handle | 返回關(guān)聯(lián)進(jìn)程的本機(jī)句柄。 |
HandleCount | 獲取由進(jìn)程打開的句柄數(shù)。 |
HasExited | 獲取指示關(guān)聯(lián)進(jìn)程是否已終止的值。 |
Id | 獲取關(guān)聯(lián)進(jìn)程的唯一標(biāo)識符。 |
MachineName | 獲取關(guān)聯(lián)進(jìn)程正在其上運(yùn)行的計(jì)算機(jī)的名稱。 |
MainModule | 獲取關(guān)聯(lián)進(jìn)程的主模塊。 |
Modules | 獲取已由關(guān)聯(lián)進(jìn)程加載的模塊。 |
PriorityClass | 獲取或設(shè)置關(guān)聯(lián)進(jìn)程的總體優(yōu)先級類別。 |
ProcessName | 獲取該進(jìn)程的名稱。 |
StartInfo | 獲取或設(shè)置要傳遞給Process的Start方法的屬性。 |
StartTime | 獲取關(guān)聯(lián)進(jìn)程啟動的時(shí)間。 |
SynchronizingObject | 獲取或設(shè)置用于封送由于進(jìn)程退出事件而發(fā)出的事件處理程序調(diào)用的對象。 |
Threads | 獲取在關(guān)聯(lián)進(jìn)程中運(yùn)行的一組線程 |
表1.0
除了上述屬性,Process類也定義了下列經(jīng)常使用的方法:
方法 | 說明 |
GetProcessById | 創(chuàng)建新的 Process 組件,并將其與您指定的現(xiàn)有進(jìn)程資源關(guān)聯(lián)。 |
GetProcessByName | 創(chuàng)建多個(gè)新的 Process 組件,并將其與您指定的現(xiàn)有進(jìn)程資源關(guān)聯(lián)。 |
GetCurrentProcess | 獲取新的 Process 組件并將其與當(dāng)前活動的進(jìn)程關(guān)聯(lián)。 |
GetProcesses | 獲取本地計(jì)算機(jī)上正在運(yùn)行的每一個(gè)進(jìn)程列表。 |
Start | 啟動一個(gè)進(jìn)程。 |
Kill | 立即停止關(guān)聯(lián)的進(jìn)程。 |
Close | 釋放與此組件關(guān)聯(lián)的所有資源。 |
WaitForExit | 指示 Process 組件無限期地等待關(guān)聯(lián)進(jìn)程退出。 |
表1.1
Process類的詳細(xì)信息可以參考 http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx
下面將舉例介紹一下Process的使用方式
1.2 建立與銷毀進(jìn)程
利用 Start 與Kill 方法可以簡單建立或者銷毀進(jìn)程,下面例子就是利用 Start 方法啟動記事本的進(jìn)程,并打開File.txt文件。2秒鐘以后,再使用 Kill 方法銷毀進(jìn)程,并關(guān)閉記事本。
static void Main(string[] args) { Process process = Process.Start("notepad.exe","File.txt"); Thread.Sleep(2000); process.Kill(); }
1.3 列舉計(jì)算機(jī)運(yùn)行中的進(jìn)程
在表1.0 中可以看到,使用 GetProcesses 方法可以獲取本地計(jì)算機(jī)上正在運(yùn)行的每一個(gè)進(jìn)程列表。
而進(jìn)程的 Id 屬性是每個(gè)進(jìn)程的唯一標(biāo)志,通過下面的方法,可以顯示當(dāng)前計(jì)算機(jī)運(yùn)行的所有進(jìn)程信息。
因?yàn)槠P(guān)系,下面例子只獲取前10個(gè)進(jìn)程。
1 static void Main(string[] args) 2 { 3 var processList = Process.GetProcesses() 4 .OrderBy(x=>x.Id) 5 .Take(10); 6 foreach (var process in processList) 7 Console.WriteLine(string.Format("ProcessId is:{0} \t ProcessName is:{1}", 8 process.Id, process.ProcessName)); 9 Console.ReadKey(); 10 }
運(yùn)行結(jié)果
如果已知進(jìn)程的Id,就可以通過 GetProcessById 方法獲取對應(yīng)的進(jìn)程。
static void Main(string[] args) { try { var process = Process.GetProcessById(1772); Console.WriteLine("Process name is:" + process.ProcessName); } catch (ArgumentException ex) { Console.WriteLine("Process is nothing!"); } Console.ReadKey(); }
同樣地,你也可能通過GetProcessByName方法獲取多個(gè)對應(yīng)名稱的進(jìn)程。
注意:如果不能找到當(dāng)前ID的進(jìn)程,系統(tǒng)就會拋出ArgumentException異常。所以使用方法 GetProcessById 獲取進(jìn)程時(shí)應(yīng)該包含在 try{...} catch{..} 之內(nèi)。
1.4 獲取進(jìn)程中的多個(gè)模塊
在表1.0 中包含了Process類的Modules屬性,通過此屬性可能獲取進(jìn)程中的多個(gè)模塊。
這些模塊可以是以 *.dll 結(jié)尾的程序集,也可以是 *.exe 結(jié)尾的可執(zhí)行程序。
下面的例子就是通過 Process 的 GetCurrentProcess 方法獲取當(dāng)前運(yùn)行的進(jìn)程信息,然后顯示當(dāng)前進(jìn)程的多個(gè)模塊信息。
1 static void Main(string[] args) 2 { 3 var moduleList = Process.GetCurrentProcess().Modules; 4 foreach (System.Diagnostics.ProcessModule module in moduleList) 5 Console.WriteLine(string.Format("{0}\n URL:{1}\n Version:{2}", 6 module.ModuleName,module.FileName,module.FileVersionInfo.FileVersion)); 7 Console.ReadKey(); 8 }
運(yùn)行結(jié)果: