2012-03-15 3 views
4

У меня есть код, который создает экземпляр Process и позже запускает его. Существует некоторая логика, которая должна проверить, запущен ли процесс. HasExited можно использовать, чтобы проверить, был ли запущен процесс, но я не могу найти аналогичную функцию для HasStarted. На первый взгляд StartTime выглядел как хороший вариант, но эта функция будет бросаться, если процесс завершится. Кроме того, в документации указано, что StartTime имеет смысл для запущенных процессов.Как определить, запущен ли процесс, но еще не вышел?

Что такое «правильный» подход для определения того, был ли запущен процесс (был запущен, но может быть прекращен)?

+0

Возможный дубликат [Как узнать, работает ли процесс?] (Http://stackoverflow.com/questions/262280/how-can-i-know-if-a-process-is-running) –

+0

Изменил вопрос немного, чтобы лучше отразить то, что я прошу, если процесс был запущен (возможно, он уже ушел). – larsmoa

+0

Изменено название немного ... –

ответ

6

Хотя методы, предложенные другими, будут работать, это не самый эффективный способ обработки таких вещей. Если вы сохраните цикл, проверяющий, вышел ли процесс или нет, вы будете тратить много системных ресурсов. Ваша забота должна состоять в том, чтобы просто знать, когда процесс выходит, а не сидеть, чтобы проверить, вышел ли он. Итак, правильный способ - это обработать события.

В приведенном ниже коде объясняется, как это сделать с помощью событий.

// Declare your process object with WithEvents, so that events can be handled. 
private Process withEventsField_MyProcess; 
Process MyProcess { 
    get { return withEventsField_MyProcess; } 
    set { 
     if (withEventsField_MyProcess != null) { 
      withEventsField_MyProcess.Exited -= MyProcess_Exited; 
     } 
     withEventsField_MyProcess = value; 
     if (withEventsField_MyProcess != null) { 
      withEventsField_MyProcess.Exited += MyProcess_Exited; 
     } 
    } 
} 

bool MyProcessIsRunning; 
private void Button1_Click(System.Object sender, System.EventArgs e) 
{ 
    // start the process. this is an example. 
    MyProcess = Process.Start("Notepad.exe"); 

    // enable raising events for the process. 
    MyProcess.EnableRaisingEvents = true; 

    // set the flag to know whether my process is running 
    MyProcessIsRunning = true; 
} 

private void MyProcess_Exited(object sender, System.EventArgs e) 
{ 
    // the process has just exited. what do you want to do? 
    MyProcessIsRunning = false; 
    MessageBox.Show("The process has exited!"); 
} 

EDIT: Зная начал ли процесс или не должен быть легким, так как начинают процесс где-то в коде. Таким образом, вы можете установить там флаг и установить значение false при выходе процесса. Я обновил код выше, чтобы показать, как легко установить такой флаг.

+0

Просто понял, что вопрос был отправлен для C#, в то время как я принял его за VB. Я заменил приведенный выше код эквивалентом C#. –

+1

+1 при использовании событий. Это намного эффективнее.Хороший код, как обычно, Pradeep :) –

+1

При использовании событий, чтобы определить, когда процесс вышел, это хороший способ сделать именно это. Однако он не определяет, начался процесс или нет. В многопоточной среде MyProcessIsRunning может быть ложным при запуске процесса infact. –

6

Поиск вашего процесса в Process.GetProcesses();, список, возвращаемый этим методом, дает все процессы, выполняемые в данный момент на машине.

2

Вы можете проверить, что по крайней мере один thread. Это будет означать, что процесс запущен и запущен.

Edit:
Вы также можете проверить процесс Id. Это вызовет исключение, если процесс не запущен.

Edit 2:
На самом деле Threads также сгенерирует исключение, если Id не установлен:

bool ProcessIsRunning(Process p) 
{ 
    bool isRunning; 
    try { 
    isRunning = !p.HasExited && p.Threads.Count > 0; 
    } 
    catch(SystemException sEx) 
    { 
    isRunning = false; 
    } 
    catch(PlatformNotSupportedException pnsEx) 
    { 
    throw; 
    } 

    return isRunning; 
} 
+0

p.HasExited будет генерировать исключение, если оно не запустилось. – user99999991

2

Вы можете использовать метод Process.GetProcessesSystem.Diagnostics имен), чтобы получить список процессов, выполняемых в настоящее время на ПК.

Process.GetProcessesByName() также может быть использован для получения списка экземпляров конкретной программы.

// Get all instances of Notepad running on the local computer. 
Process [] localByName = Process.GetProcessesByName("YourProcess"); 
Смежные вопросы