2010-11-04 64 views
0

我寫了一個窗口服務,它監視數據庫表的待處理的作業,併產生線程來運行那些工作和每個反過來這些線程啓動一個過程中做實際工作(這個過程是一個微軟工具,而不是一個自定義一)。這工作正常,但如果其中一項工作比平常花費更長時間,我想殺死那份工作。如何殺死從C#中的線程(由線程池創建)啓動的進程?

這怎麼辦?我是否需要中止線程或者終止線程啓動的進程?我還需要將該進程的標準輸出保存在文本文件中。我使用下面的代碼來做到這一點。

using (Process process = Process.Start(startInfo)) 
{ 
    LogToTextFile(process.StandardOutput.ReadToEnd()); 
    process.WaitForExit(); 
    exitCode = process.ExitCode; 
} 

線程是否有可能在同一個表中檢查一個標誌並殺死正在運行的進程,以便它不需要中止?我使用ThreadPool.QueueUserWorkItem來創建一個線程。在不停止Windows服務的情況下停止這些正在運行的進程的最可靠方法是什麼?

回答

6

Process.Kill是你在找什麼。殺死線程將是不明智的,並且不會對它啓動的進程產生影響。

假設你要等待60秒的過程來完成,你可以這樣做:

using (Process process = Process.Start(startInfo)) 
{ 
    LogToTextFile(process.StandardOutput.ReadToEnd()); 

    if(process.WaitForExit(60000)) 
    { 
     exitCode = process.ExitCode; 
    } 
    else 
    { 
     process.Kill(); 
    } 
} 

要倍加清晰,不殺一個線程池線程

+0

您的其他那裏。 – xcud 2010-11-04 19:02:54

+0

@xcud:好的;謝謝。 – 2010-11-04 19:03:23

+0

感謝您的答覆,但決定是否終止該進程是由用戶拍攝並存儲在一個標誌一個表,它不是一個具體的時間限制。還我觀察到,當我請process.StandardOutput.ReadToEnd(),該線本身等待直到過程完成,並且控制將不會被傳遞到下一行。所以我不確定上面的代碼是否可以工作。我會嘗試。 – RKP 2010-11-05 09:52:11