官术网_书友最值得收藏!

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方法直接結束某個進程。

主站蜘蛛池模板: 商洛市| 浦东新区| 镇宁| 织金县| 屏东市| 扎兰屯市| 那坡县| 灵川县| 阜新| 长治县| 兰溪市| 林西县| 三门县| 甘德县| 修水县| 政和县| 竹北市| 漯河市| 锦州市| 茂名市| 郓城县| 娱乐| 贵州省| 仙游县| 乃东县| 鸡东县| 新乡市| 怀集县| 康马县| 尼木县| 汝阳县| 英德市| 西乌| 赞皇县| 丽水市| 肥西县| 金乡县| 汉源县| 碌曲县| 兰西县| 泌阳县|