溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

細(xì)說進(jìn)程、應(yīng)用程序域與上下文之間的關(guān)系(一)——進(jìn)程的概念與作用

發(fā)布時間:2020-06-20 16:27:40 來源:網(wǎng)絡(luò) 閱讀:766 作者:leslies2 欄目:編程語言

引言

本文主要是介紹進(jìn)程(Process)、應(yīng)用程序域(AppDomain)、.NET上下文(Context)的概念與操作。
雖然在一般的開發(fā)當(dāng)中這三者并不常用,但熟悉三者的關(guān)系,深入了解其作用,對提高系統(tǒng)的性能有莫大的幫助。
在本篇最后的一節(jié)當(dāng)中將會介紹到三者與線程之間的關(guān)系,希望對多線程開發(fā)人員能提供一定的幫助。
因?yàn)闀r間倉促,文中有錯誤的地方敬請點(diǎn)評。

目錄

一、進(jìn)程的概念與作用

二、應(yīng)用程序域

三、深入了解.NET上下文

四、進(jìn)程應(yīng)用程序域與線程的關(guān)系

 

一、進(jìn)程的概念與作用

進(jìn)程(Process)是Windows系統(tǒng)中的一個基本概念,它包含著一個運(yùn)行程序所需要的資源。進(jìn)程之間是相對獨(dú)立的,一個進(jìn)程無法直接訪問另 一個進(jìn)程的數(shù)據(jù)(除非利用分布式計算方式),一個進(jìn)程運(yùn)行的失敗也不會影響其他進(jìn)程的運(yùn)行,Windows系統(tǒng)就是利用進(jìn)程把工作劃分為多個獨(dú)立的區(qū)域 的。進(jìn)程可以理解為一個程序的基本邊界。

 

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)程終止時指定的值。
ExitTime 獲取關(guān)聯(lián)進(jìn)程退出的時間。
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ī)的名稱。
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)程啟動的時間。
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)建多個新的 Process 組件,并將其與您指定的現(xiàn)有進(jìn)程資源關(guān)聯(lián)。
GetCurrentProcess 獲取新的 Process 組件并將其與當(dāng)前活動的進(jìn)程關(guān)聯(lián)。
GetProcesses 獲取本地計算機(jī)上正在運(yùn)行的每一個進(jìn)程列表。
Start 啟動一個進(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ī)運(yùn)行中的進(jìn)程

在表1.0 中可以看到,使用 GetProcesses 方法可以獲取本地計算機(jī)上正在運(yùn)行的每一個進(jìn)程列表。
而進(jìn)程的 Id 屬性是每個進(jìn)程的唯一標(biāo)志,通過下面的方法,可以顯示當(dāng)前計算機(jī)運(yùn)行的所有進(jìn)程信息。
因?yàn)槠P(guān)系,下面例子只獲取前10個進(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é)果

細(xì)說進(jìn)程、應(yīng)用程序域與上下文之間的關(guān)系(一)——進(jìn)程的概念與作用

 

如果已知進(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方法獲取多個對應(yīng)名稱的進(jìn)程。

注意:如果不能找到當(dāng)前ID的進(jìn)程,系統(tǒng)就會拋出ArgumentException異常。所以使用方法 GetProcessById 獲取進(jìn)程時應(yīng)該包含在 try{...} catch{..} 之內(nèi)。

 

1.4 獲取進(jìn)程中的多個模塊

在表1.0 中包含了Process類的Modules屬性,通過此屬性可能獲取進(jìn)程中的多個模塊。
這些模塊可以是以 *.dll 結(jié)尾的程序集,也可以是 *.exe 結(jié)尾的可執(zhí)行程序。
下面的例子就是通過 Process 的 GetCurrentProcess 方法獲取當(dāng)前運(yùn)行的進(jìn)程信息,然后顯示當(dāng)前進(jìn)程的多個模塊信息。

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é)果:

細(xì)說進(jìn)程、應(yīng)用程序域與上下文之間的關(guān)系(一)——進(jìn)程的概念與作用

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI