- .NET 4.0面向對象編程漫談:應用篇
- 金旭亮
- 1801字
- 2019-01-01 12:20:00
15.2 進程的啟動與終止
在了解了有關進程和線程的許多知識之后,就可以進入開發實踐了。本節介紹在.NET應用程序中創建和終止進程的基本方法。
15.2.1 進程啟動
Process類
.NET應用程序控制進程的核心是Process類,它所處的繼承層次如圖15-10所示。
如圖15-10所示,Process類繼承自Component類,所以,通常又稱其為“Process組件”。Process組件代表一個托管進程,底層封裝的是操作系統的本地進程。
另一個重要的類是ProcessStartInfo類,顧名思義,這個類封裝了進程啟動時的各種控制參數。我們馬上就會在下面的例子中看到這個類的作用。
提示
繼承自Component的類稱為“組件”,類似地,繼承自“Container”的類稱為“容器”,組件放在容器中,容器通過一個實現了ISite接口的類管理組件之間以及組件和容器之間的通信關系。這個實現了ISite接口的類被稱為組件的“站點”。
請讀者自行在Visual Studio文檔中了解詳情。

圖15-10 Process組件的繼承樹
使用Process.Start方法啟動進程
Process類的Start靜態方法用于啟動一個進程,例如以下代碼將會運行一個IE瀏覽器的實例:
Process.Start("IExplore.exe");
Start方法有多個重載的版本,以下這個版本可能是比較常用的,它可以向進程提供一個啟動參數:
Process.Start("IExplore.exe","www.baidu.com");
提示
如果要啟動的EXE文件路徑不在Windows的環境變量中,則必須指明其絕對路徑。
讀者一定很熟悉這樣的操作:在資源管理器中直接雙擊一個后綴名為“.docx”的文件,Windows會自動啟動Word程序來編輯這個文件。“.docx”文件與Word應用程序之間的這種關系稱為“文件關聯”。可以在資源管理器中重新定義這種關聯關系,其方法是:
在資源管理器中點擊選中此文件,右擊,從彈出菜單中選“打開方式”→“選擇默認程序”命令(見圖15-11)。
如圖15-11所示,從列表中選擇一個程序,選中“始終使用選擇的程序打開這種文件”復選框,單擊“確定”,就建立好了文件關聯。以后在資源管理器中雙擊此類文件時,打開的程序就是用戶所選擇的程序。
這種通過雙擊“.docx”文件啟動Word應用程序的方法稱為“使用操作系統外殼程序啟動相應進程打開特定類型的文件”。
默認情況下,Process組件的Start方法支持使用操作系統外殼程序啟動進程:
Process.Start("c:\\面向對象編程漫談目錄.docx");
以上代碼將自動使用Word打開并編輯C盤根目錄下的“面向對象編程漫談目錄.docx”文檔。

圖15-11 修改文件關聯
向要啟動的進程傳送信息
在某些情況下,我們可能希望向進程傳送一些控制信息,比如希望此進程啟動時窗體自動最小化,可以通過向進程傳送一個ProcessStartInfo控制信息對象完成此功能,示例代碼如下:
ProcessStartInfo startInfo=new ProcessStartInfo("IExplore.exe");startInfo.WindowStyle=ProcessWindowStyle.Minimized;//啟動后最小化
startInfo.Arguments="www.sina.com.cn";//自動訪問新浪網
Process.Start(startInfo);//啟動進程
事實上,使用ProcessStartInfo對象還可以干更多的事,請看示例程序ProcessInfo中的啟動進程窗體(見圖15-12)。

圖15-12 啟動新進程
如圖15-12所示,選擇一個“.docx”文檔之后,可以讓啟動的Word進程自動最大化窗體,并且通過指定一個“謂詞(Verb)”,讓Word自動打印此文件。
每個應用程序都可以添加一到多個Verb,用于指定要執行的功能,可以通過ProcessStartInfo對象的Verbs屬性知道某程序擁有哪些Verb:
ProcessStartInfo si=new ProcessStartInfo("應用程序名或關聯的文檔名");
foreach(string verb in si.Verbs)//可以獲取此應用程序所支持的所有謂詞
{...}
知道了進程支持的Verb之后,便可以使用此Verb要求進程執行特定的功能。示例程序使用以下代碼通知Word打印指定的文檔:
ProcessStartInfo startInfo=new ProcessStartInfo("Word文檔名");
startInfo.Verb="Print";
Process.Start(startInfo);
15.2.2 中止一個進程
可以使用兩種方法中止一個進程,調用相應Process組件的CloseMainWindow方法和Kill方法。
請求關閉進程
對于擁有可視化用戶界面的Windows應用程序,其主線程創建的窗體稱為主窗體。在主線程所屬的進程對象上調用CloseMainWindow方法,將會請求關閉主窗體并結束進程。
通過調用CloseMainWindow方法發出的結束進程運行的請求不會強制應用程序立即退出,它相當于用戶直接點擊主窗口上的“關閉”按鈕。應用程序可以在退出前請求用戶確認,也可以拒絕退出。
在ProcessInfo示例程序中,CloseProcess函數完成關閉一個進程的工作:
private void CloseProcess()
{
Process curProc=……;//獲取要關閉進程所對應的Process對象的引用
bool ret=curProc.CloseMainWindow();//關閉主窗體
curProc.Close();//釋放進程所占用的資源
if(ret)//如果關閉請求成功發送到指定的進程
//……(后繼代碼略)
}
CloseMainWindow方法是非阻塞調用,這就是說,向指定進程發出一個關閉請求之后,并不等待這一進程真正結束就馬上執行下一條語句。
當成功地向指定進程發送了“請求關閉”消息之后,CloseMainWindow方法返回true。如果指定進程沒有主窗體,或者不能響應此消息(比如指定的進程可能打開了一個模式對話框,在這種情況下,只有等用戶點擊相應按鈕關閉此對話框后指定的進程才能繼續運行),CloseMainWindow方法返回false。
強制關閉進程
可以使用Process類的Kill方法強制關閉一個進程:
private void KillProcess()
{
Process curProc=……;//獲取要關閉進程所對應的Process對象的引用
curProc.Kill();
//……
}
與CloseMainWindow方法不同,Kill方法實際上是請求操作系統直接結束進程,它不給要關閉的進程保存數據的機會,因此除非要結束的進程沒有任何數據需要保存,否則不要采用Kill方法直接結束某個進程。