2012-02-13 69 views
1

我基本上需要運行這段代碼,每5秒左右:輪詢的過程與低CPU使用率每X秒

if (oneperone.HasExited) 
{ 
    oneperone.Start(); 
} 
foreach (Process p in System.Diagnostics.Process.GetProcessesByName("WerFault")) 
{ 
    try 
    { 
     p.Kill(); 
     p.WaitForExit(); // possibly with a timeout 
    } 
    catch (Win32Exception winException) 
    { 
     // process was terminating or can't be terminated - deal with it 
    } 
    catch (InvalidOperationException invalidException) 
    { 
     // process has already exited - might be able to let this one go 
    } 
} 

我使用計時器這裏的例子嘗試:和http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx我已經嘗試運行系統線程等待命令的無限循環,但都給不可接受的性能和系統等待命令顯然鎖定線程我需要做的其他事情之間的5秒迭代

請記住5秒的事情是任意的它可以更長或更短我只需要不斷重複此代碼,但有效地希望有人有一個優雅ul解決方案?

+0

您可以使用並行foreach,因此您可以同時停止多個進程,並且總體執行時間將更短 – 2012-02-13 20:35:59

+0

@arcaine:如果從(說)5處理第三個,出於任何原因運行超過5秒?它應該被殺死,所以另一個應該開始? – Tigran 2012-02-13 20:42:56

+0

我不確定我是否理解你的問題,一個人是一個需要一直運行的程序,WerFault是崩潰過程,如果因爲.HasExited不會在一個過程中觸發崩潰到邊一步這我正在檢查崩潰過程,並將其殺死,以允許一個新的重新啓動 – arcanine 2012-02-13 20:46:06

回答

1

有可能更好的方式來實現你所需要的,但這裏是建議你想要的東西:只要你不這樣做長端昂貴的操作

的Thread.Sleep會給你低CPU使用率每次迭代。

使用Sleep調用創建新線程並排隊進程以殺死某個隊列(以避免在該線程上進行長時間操作並重復「kill請求」);從單獨的線程/ worker上的隊列中終止進程。避免嘗試多次殺死同一個進程。