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

引言

在河北等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎ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)營(yíng)銷推廣,外貿(mào)營(yíng)銷網(wǎng)站建設(shè),河北網(wǎng)站建設(shè)費(fèi)用合理。

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

目錄

一、進(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)程之間是相對(duì)獨(dú)立的,一個(gè)進(jìn)程無法直接訪問另 一個(gè)進(jìn)程的數(shù)據(jù)(除非利用分布式計(jì)算方式),一個(gè)進(jìn)程運(yùn)行的失敗也不會(huì)影響其他進(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)先級(jí)別等。
表1.0 顯示了Process類的常用屬性:
 

屬性 說明
BasePriority 獲取關(guān)聯(lián)進(jìn)程的基本優(yōu)先級(jí)。
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)識(shí)符。
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)先級(jí)類別。
ProcessName 獲取該進(jìn)程的名稱。
StartInfo 獲取或設(shè)置要傳遞給Process的Start方法的屬性。
StartTime 獲取關(guān)聯(lián)進(jìn)程啟動(dòng)的時(shí)間。
SynchronizingObject 獲取或設(shè)置用于封送由于進(jìn)程退出事件而發(fā)出的事件處理程序調(diào)用的對(duì)象。
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)前活動(dòng)的進(jìn)程關(guān)聯(lián)。
GetProcesses 獲取本地計(jì)算機(jī)上正在運(yùn)行的每一個(gè)進(jìn)程列表。
Start 啟動(dòng)一個(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 方法可以簡(jiǎn)單建立或者銷毀進(jìn)程,下面例子就是利用 Start 方法啟動(dòng)記事本的進(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é)果

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

 

如果已知進(jìn)程的Id,就可以通過 GetProcessById 方法獲取對(duì)應(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è)對(duì)應(yīng)名稱的進(jìn)程。

注意:如果不能找到當(dāng)前ID的進(jìn)程,系統(tǒng)就會(huì)拋出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é)果:

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

 

分享名稱:細(xì)說進(jìn)程、應(yīng)用程序域與上下文之間的關(guān)系(一)——進(jìn)程的概念與作用
轉(zhuǎn)載來于:http://bm7419.com/article24/jddoce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、定制網(wǎng)站動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)Google、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名