에 대한 참조를 얻을 때 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()
갈 길입니다. 그러나 프로세스 실행 방법 (예 : 제목 표시 줄의 유무에 관계없이 서비스 또는 일반 앱)에 따라 프로세스를 찾기 위해 하나 이상의 다른 기준을 사용해야 할 수도 있습니다.