2009-10-09 17 views
11

Używam C# .NET 2.0. Muszę ustalić, czy istnieje PID. Wpadłem na następujący kod:Jak ustalić, czy identyfikator procesu istnieje

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

Czy istnieje lepszy sposób na zrobienie tego poza iterowaniem wszystkich procesów?

Odpowiedz

18

Szybka uwaga: nie można określić, czy uruchomiony jest proces inny niż własny. Możesz tylko powiedzieć, że był uruchomiony w pewnym momencie w niedawnej przeszłości. Proces może po prostu przestać istnieć w danym momencie, w tym dokładnie w momencie, gdy sprawdzisz, czy ma pasujący identyfikator.

Tego typu determinacja może być lub nie być wystarczająco dobra dla twojego programu. To naprawdę zależy od tego, co próbujesz zrobić.

Oto skrócona wersja kodu, który napisałeś.

private bool ProcessExists(int id) { 
    return Process.GetProcesses().Any(x => x.Id == id); 
} 
2

System.Diagnostics.Process.GetProcessById(iProcessID) rzucił ArgumentException, jeśli proces nie istnieje. Chociaż nie jest to najlepszy sposób sprawdzenia, czy proces istnieje, ale mam nadzieję, że właśnie tego szukasz.

+0

Dziękuję za sugestię, ale ogólnie popełniam błąd w wychwytywaniu wyjątków przy próbie rozwiązania pewnej wartości, jako standardową praktykę. – Ken

+0

Zgadzam się, ale liczyłem na to, że właśnie tego szukał twój program, nie mogłem wymyślić powodu, aby sprawdzić, czy określony identyfikator procesu był żywy. –

6

Ryzykowne jest: Skąd wziął się ten identyfikator procesu? Jeśli jest to tylko numer, który zapisałeś kiedyś wcześniej, oryginalny proces mógł umrzeć, a nowy proces mógł być running with the same ID.

Co próbujesz osiągnąć? Może istnieć lepszy sposób na osiągnięcie rzeczywistego celu.

+0

PID jest niezawodny. To PID drugiej aplikacji uruchamia moją aplikację. Druga aplikacja gwarantuje, że zawsze działa, gdy moja aplikacja jest uruchomiona. (Moja aplikacja to w zasadzie DialogBox, w którym druga aplikacja jest jego rodzicem). Poza tym szczegóły Frankensteina nie są warte uwagi w związku z tym pytaniem. Dzięki. – Ken

+0

Ale twoje pytanie dotyczy ustalenia, czy działa. Jeśli masz pewność, że działa, dlaczego musisz to sprawdzić? –

+0

Dobra uwaga. To kontrola zdrowego rozsądku na wypadek, gdyby wyjątkowy przypadek rzeczywiście nastąpił z jakiegoś powodu, który jest poza mną. Zmienię tekst pytania, aby lepiej odzwierciedlał to, co faktycznie robi przykładowy kod. Dzięki. – Ken

Powiązane problemy