2012-01-24 101 views
4

以下是這種情況: 我必須創建一個程序,將另一個進程輸出流輸入到文本框中。它自我不會造成太多問題。然而,事實是我必須運行這個控制檯應用程序的5個實例並將輸出重定向到5個文本框,並且能夠隨時殺死這些進程中的任何一個。據我所知,最好的方法是異步的。但是這裏的問題是在不同的線程上創建進程。我如何殺死它而無法訪問它,因爲它不存在於我必須殺死它的範圍內。我最好的猜測是得到其在Process.Start() PID,這樣我就可以殺死它,所以...Process.Kill()和進程事件

是否有可能從火過程中的任何事件上Process.kill()命令? 如果沒有 - 是否有辦法在大約與Process.Kill()相同的時間間隔內殺死一個進程,這會引發某種事件?

或者,也許有人可以建議我一些其他方法或最佳做法,如何解決這些問題?

編輯:我在不同的線程上運行所有進程的原因是,我使用Thread.Sleep()其中一些如果有和輸入參數,告訴我必須在x秒後殺死進程。

+1

你說:「但是這裏的問題是殺死進程,它是在不同的線程上創建的。一個進程不會在另一個線程上創建。過程是一個過程。你在混合進程和線程嗎? – PVitt

+1

@PVitt我認爲他在談論過程對象,所以最好的方法可能是存儲一個靜態列表<>進程名稱和進程ID,你可以獲得進程ID並殺死它! – Burimi

+0

但是可以在啓動信息上分配進程名稱和ID嗎? OS不是指定那些OS的人嗎?由於我只運行同一進程的5個實例,因此進程名稱也完全相同。 – TheBW

回答

1

Process.Kill殺死該進程()命令出於某種原因,事實上,火災過程已退出事件。最簡單的方法讓我知道這個過程被殺死,通過製作一個易變的字符串來保存關於它是如何結束的信息。 (在process.kill等之前將其改爲「殺死」......)

0

首先你根本不需要線程。啓動一個進程本身就是異步的,所以Process.Start(...)不會被阻塞,並且你可以創建儘可能多的進程。

您應該考慮創建Process類實例並將CanRaiseEvents屬性設置爲true,而不是使用靜態Process.Start方法。此外,還有一些可以註冊的事件(每個實例) - 只有在CanRaiseEvents設置爲true的情況下,以及進程退出後(包括Kill()調用)纔會引發這些事件。

0

當調用

Process.Start() 

它返回一個Process類實例,它可以用來從它輸出檢索信息和任何時間

Process p = Process.Start("process.exe"); 
//some operations with process, may be in another thread 
p.Kill()