Как определить, запущен ли процесс, но еще не завершен? - PullRequest
4 голосов
/ 15 марта 2012

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

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

Ответы [ 4 ]

6 голосов
/ 15 марта 2012

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

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

6 голосов
/ 15 марта 2012

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

2 голосов
/ 15 марта 2012

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

// Get all instances of Notepad running on the local computer.
Process [] localByName = Process.GetProcessesByName("YourProcess");
2 голосов
/ 15 марта 2012

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

Редактировать:
Вы также можете проверить процесс Id .Он выдаст исключение, если процесс еще не начался.

Редактировать 2:
На самом деле Потоки также сгенерирует исключение, если 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;
}
...