[C#] 프로세스가 실행 중인지 어떻게 알 수 있습니까?

에 대한 참조를 얻을 때 System.Diagnostics.Process프로세스가 현재 실행 중인지 어떻게 알 수 있습니까?



답변

이것은 이름으로 수행하는 방법입니다.

Process[] pname = Process.GetProcessesByName("notepad");
if (pname.Length == 0)
  MessageBox.Show("nothing");
else
  MessageBox.Show("run");

나중에 조작 할 수 있도록 모든 프로세스를 반복하여 ID를 얻을 수 있습니다.

Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
   Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}


답변

이것이 리플렉터를 사용한 후 찾은 가장 간단한 방법입니다. 이를 위해 확장 방법을 만들었습니다.

public static class ProcessExtensions
{
    public static bool IsRunning(this Process process)
    {
        if (process == null)
            throw new ArgumentNullException("process");

        try
        {
            Process.GetProcessById(process.Id);
        }
        catch (ArgumentException)
        {
            return false;
        }
        return true;
    }
}

Process.GetProcessById(processId)방법은 호출 ProcessManager.IsProcessRunning(processId)방법과 발생 ArgumentException과정이 존재하지 않는 경우에. 어떤 이유로 ProcessManager수업은 내부에 있습니다 …


답변

동기식 솔루션 :

void DisplayProcessStatus(Process process)
{
    process.Refresh();  // Important


    if(process.HasExited)
    {
        Console.WriteLine("Exited.");
    }
    else
    {
        Console.WriteLine("Running.");
    }
}

비동기 솔루션 :

void RegisterProcessExit(Process process)
{
    // NOTE there will be a race condition with the caller here
    //   how to fix it is left as an exercise
    process.Exited += process_Exited;
}

static void process_Exited(object sender, EventArgs e)
{
   Console.WriteLine("Process has exited.");
}


답변

reshefm은 꽤 좋은 대답을했습니다. 그러나 프로세스가 시작되지 않은 상황을 설명하지는 않습니다.

다음은 그가 게시 한 내용의 수정 된 버전입니다.

    public static bool IsRunning(this Process process)
    {
        try  {Process.GetProcessById(process.Id);}
        catch (InvalidOperationException) { return false; }
        catch (ArgumentException){return false;}
        return true;
    }

그의 ArgumentNullException은 실제로 null 참조 예외라고 가정하고 어쨌든 시스템에 의해 발생하기 때문에 프로세스가 시작되지 않았거나 close () 메소드를 사용하여 방법.


답변

이것은 하나의 라이너이어야합니다.

public static class ProcessHelpers {
    public static bool IsRunning (string name) => Process.GetProcessesByName(name).Length > 0;
}


답변

이 기능의 신뢰성에 달려 있습니다. 보유한 특정 프로세스 인스턴스가 여전히 실행 중이고 100 % 정확도로 사용 가능한지 알고 싶다면 운이 좋지 않습니다. 관리되는 프로세스 개체에는 프로세스를 식별하는 방법이 2 가지 밖에 없기 때문입니다.

첫 번째는 프로세스 ID입니다. 불행히도 프로세스 ID는 고유하지 않으며 재활용 할 수 있습니다. 일치하는 ID에 대한 프로세스 목록을 검색하면 동일한 ID를 가진 프로세스가 실행 중임을 나타내지 만 반드시 프로세스는 아닙니다.

두 번째 항목은 프로세스 핸들입니다. Id와 같은 문제가 있지만 작업하기가 더 어색합니다.

중간 수준의 안정성을 찾고 있다면 동일한 ID의 프로세스에 대한 현재 프로세스 목록을 확인하는 것으로 충분합니다.


답변

Process.GetProcesses()갈 길입니다. 그러나 프로세스 실행 방법 (예 : 제목 표시 줄의 유무에 관계없이 서비스 또는 일반 앱)에 따라 프로세스를 찾기 위해 하나 이상의 다른 기준을 사용해야 할 수도 있습니다.