2012-02-13 2 views
1

я в основном нужно запустить этот код каждые 5 секунд или так:опросом процесс каждые X секунд с использованием низкой CPU

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 секунд произвольно это может быть длиннее или короче. Мне просто нужно продолжать повторять этот код, но, надеюсь, у кого-то есть изящество решение?

+0

Вы можете использовать параллельный foreach, чтобы одновременно остановить несколько процессов, и общее время выполнения будет короче –

+0

@arcaine: что произойдет, если из 5 процессов будет обрабатываться 3-й, по какой-либо причине работает более 5 секунд? Должен ли он быть убит, чтобы другой начал? – Tigran

+0

Я не уверен, что я понимаю ваш вопрос, oneperone - это программа, которая должна быть запущена все время, WerFault - это процесс сбоя, вы не можете выполнить однопроцессорный процесс онлайн, если он разбился, потому что .HasExited не запускается во время crash to side step this, я проверяю процесс сбоя и убиваю его, чтобы разрешить новую перезагрузку – arcanine

ответ

1

Есть, вероятно, лучший способ добиться того, что вам нужно, но вот предложение для того, что вы хотите:

Thread.Sleep даст вам низкий уровень использования процессора до тех пор, пока вы не делать длинные концевые дорогостоящие операции каждая итерация.

Создайте новую тему с помощью вызовов сна и процессов очереди, чтобы убить в некоторой очереди (чтобы избежать длительных операций над этим потоком и дублирования «запросов на убийство»); убить процессы из очереди на отдельном потоке/работнике. Избегайте попыток убить один и тот же процесс более одного раза.