您好,登錄后才能下訂單哦!
引言
本文主要是介紹進程(Process)、應用程序域(AppDomain)、.NET上下文(Context)的概念與操作。
雖然在一般的開發當中這三者并不常用,但熟悉三者的關系,深入了解其作用,對提高系統的性能有莫大的幫助。
在本篇最后的一節當中將會介紹到三者與線程之間的關系,希望對多線程開發人員能提供一定的幫助。
因為時間倉促,文中有錯誤的地方敬請點評。
目錄
一、進程的概念與作用
二、應用程序域
三、深入了解.NET上下文
四、進程應用程序域與線程的關系
一、進程的概念與作用
進程(Process)是Windows系統中的一個基本概念,它包含著一個運行程序所需要的資源。進程之間是相對獨立的,一個進程無法直接訪問另 一個進程的數據(除非利用分布式計算方式),一個進程運行的失敗也不會影響其他進程的運行,Windows系統就是利用進程把工作劃分為多個獨立的區域 的。進程可以理解為一個程序的基本邊界。
1.1 Process 的屬性與方法
在 System.Diagnostics 命名空間當中存在Process類,專門用于管理進程的開始、結束,訪問進程中的模塊,獲取進程中的線程,設定進程的優先級別等。
表1.0 顯示了Process類的常用屬性:
屬性 | 說明 |
BasePriority | 獲取關聯進程的基本優先級。 |
ExitCode | 獲取關聯進程終止時指定的值。 |
ExitTime | 獲取關聯進程退出的時間。 |
Handle | 返回關聯進程的本機句柄。 |
HandleCount | 獲取由進程打開的句柄數。 |
HasExited | 獲取指示關聯進程是否已終止的值。 |
Id | 獲取關聯進程的唯一標識符。 |
MachineName | 獲取關聯進程正在其上運行的計算機的名稱。 |
MainModule | 獲取關聯進程的主模塊。 |
Modules | 獲取已由關聯進程加載的模塊。 |
PriorityClass | 獲取或設置關聯進程的總體優先級類別。 |
ProcessName | 獲取該進程的名稱。 |
StartInfo | 獲取或設置要傳遞給Process的Start方法的屬性。 |
StartTime | 獲取關聯進程啟動的時間。 |
SynchronizingObject | 獲取或設置用于封送由于進程退出事件而發出的事件處理程序調用的對象。 |
Threads | 獲取在關聯進程中運行的一組線程 |
表1.0
除了上述屬性,Process類也定義了下列經常使用的方法:
方法 | 說明 |
GetProcessById | 創建新的 Process 組件,并將其與您指定的現有進程資源關聯。 |
GetProcessByName | 創建多個新的 Process 組件,并將其與您指定的現有進程資源關聯。 |
GetCurrentProcess | 獲取新的 Process 組件并將其與當前活動的進程關聯。 |
GetProcesses | 獲取本地計算機上正在運行的每一個進程列表。 |
Start | 啟動一個進程。 |
Kill | 立即停止關聯的進程。 |
Close | 釋放與此組件關聯的所有資源。 |
WaitForExit | 指示 Process 組件無限期地等待關聯進程退出。 |
表1.1
Process類的詳細信息可以參考 http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx
下面將舉例介紹一下Process的使用方式
1.2 建立與銷毀進程
利用 Start 與Kill 方法可以簡單建立或者銷毀進程,下面例子就是利用 Start 方法啟動記事本的進程,并打開File.txt文件。2秒鐘以后,再使用 Kill 方法銷毀進程,并關閉記事本。
static void Main(string[] args) { Process process = Process.Start("notepad.exe","File.txt"); Thread.Sleep(2000); process.Kill(); }
1.3 列舉計算機運行中的進程
在表1.0 中可以看到,使用 GetProcesses 方法可以獲取本地計算機上正在運行的每一個進程列表。
而進程的 Id 屬性是每個進程的唯一標志,通過下面的方法,可以顯示當前計算機運行的所有進程信息。
因為篇幅關系,下面例子只獲取前10個進程。
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 }
運行結果
如果已知進程的Id,就可以通過 GetProcessById 方法獲取對應的進程。
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方法獲取多個對應名稱的進程。
注意:如果不能找到當前ID的進程,系統就會拋出ArgumentException異常。所以使用方法 GetProcessById 獲取進程時應該包含在 try{...} catch{..} 之內。
1.4 獲取進程中的多個模塊
在表1.0 中包含了Process類的Modules屬性,通過此屬性可能獲取進程中的多個模塊。
這些模塊可以是以 *.dll 結尾的程序集,也可以是 *.exe 結尾的可執行程序。
下面的例子就是通過 Process 的 GetCurrentProcess 方法獲取當前運行的進程信息,然后顯示當前進程的多個模塊信息。
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 }
運行結果:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。