Как определить, существует ли идентификатор процесса - PullRequest
12 голосов
/ 09 октября 2009

Я использую C # .NET 2.0. Мне нужно определить, существует ли PID. Я придумал следующий код:

private bool ProcessExists(int iProcessID)
{
    foreach (Process p in Process.GetProcesses())
    {
        if (p.Id == iProcessID)
        {
            return true;
        }
    }
    return false;
}

Есть ли лучший способ сделать это, кроме итерации всех процессов?

Ответы [ 3 ]

20 голосов
/ 09 октября 2009

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

Как говорится, этот тип определения может быть или не быть достаточно хорошим для вашей программы. Это действительно зависит от того, что вы пытаетесь сделать.

Вот сокращенная версия написанного вами кода.

private bool ProcessExists(int id) {
  return Process.GetProcesses().Any(x => x.Id == id);
}
7 голосов
/ 09 октября 2009

Здесь рискованно: откуда вы взяли этот идентификатор процесса? Если это просто число, которое вы сохранили ранее, исходный процесс мог бы умереть, и новый процесс мог бы работать с тем же ID .

Чего ты пытаешься достичь? Там может быть лучший способ достижения вашей реальной цели.

2 голосов
/ 09 октября 2009

System.Diagnostics.Process.GetProcessById(iProcessID) вызовет ArgumentException, если процесс не существует. Хотя это не лучший способ проверить, существует ли этот процесс, но, надеюсь, это то, что вы ищете.

...