2012-11-13 2 views
4

우선, 프로세스 래퍼를 사용하여 프로세스의 시작 경로를 유지하려고합니다..NET 프로세스 문제 Windows

public class MCProcess() 
{ 
     public Process Process { get; set;} 
     public string StartingPath { get; set;} 

     public MCProcess(string start, Process p) 
     { 
      Process = p; 
      StartingPath = start; 
     } 
} 

지금, 나는 모든 프로세스를 추적하고 내 프로그램이 시작 모든 프로세스의 시작 경로를 유지하는 데 사용하는 List<MCProcces>라는 runningProcesses을 유지한다. 예를 들어

:

string path = "C:\\Windows\\System32\\notepad.exe"; 
Process temp = Process.Start(path); 
runningProcesses.Add(new MCProcess(path, temp)); 

지금, 때때로, 내가 실행 한 프로세스를 종료합니다. 작업 관리자를 살펴보고 내가 시작한 각 프로세스의 MainModuleName을 찾으려고하지 않고 이유에 따라 StartingPath를 포함했습니다.

메모장을 닫으려는 경우 내 runningProcesses를 반복하고 메모장의 시작 경로가있는 프로세스를 찾은 다음 Process.Kill을 사용하여 해당 프로세스를 종료하십시오.

string path = "C:\\Windows\\System32\\notepad.exe"; 
for (int i = 0; i < runningProcesses.Count; i++) 
{ 
    if (runningProcesses[i].StartingPath == path) 
    { 
      runningProcesses[i].Process.Kill(); 
      runningProcesses.RemoveAt(i); 
    } 
} 

이 코드는 Windows 7에서 정상적으로 작동하며 전혀 문제가 없었습니다. 그러나 Windows XP에서 이것을 사용할 때, Process.Kill로 ArgumentNullException을 얻습니다.

Windows XP에서 제대로 작동하지 않는 Process 클래스에 대해 뭔가 있습니까?

+1

같은 것이 아닙니다보십시오 모든 프로세스

를 제거해야 null 참조로 실행되는 것을 무효화하는 방법을 알아 냈습니다. –

+0

@Ramhound 네, runningProcess [i]가 null이 아닙니다. –

+0

'runProcesses [i]'가 실제로 null임을 의미하는 null expecton을 얻고 있습니다. –

답변

2

루프를 사용하는 동안 당신은 컬렉션을 수정하는 7.이 승리에서 작업하는 방법을 놀라 울 . 당신은, 프로세스의 인덱스를 삭제 한 다음 한 번 루프에 대해 수행 할 유지 [내가]`사실은 널 (null)이`runningProcesses을 확인 했

var processesToRemove = runningProcesses.Where (p => String.Equals(p.StartingPath, path); 
foreach(var process in processToRemove) 
{ 
    process.Process.Kill(); 
    runningProcesses.Remove(process); 
} 
+0

컬렉션을 반복하면서 컬렉션을 수정하면 컬렉션을 통해 열거하지 않는 한 100 % 괜찮습니다. 이 경우 일어나는 최악의 상황은 죽은 프로세스 이후의 아이템이 건너 뛸 것이고, 이는 쉽게 'i -' – Justin

+0

으로 고정됩니다. 나는 당신과 동의하고이 질문의 문맥에서 논평했습니다 (일반화 된 것이 아닙니다). .NET은 foreach/IEnumerable을 통해이를 처리합니다. 그러나 개발자는 다른 반복 구문에서이를 악용하지 않도록주의해야합니다. 이러한 버그는 찾기 어렵습니다. (물론 그것이 모든 곳에서 잘못되었다는 것을 말하는 것이 아니라, 상황에 달려있다) – Tilak

0

당신의 재산을 공개하고 시도 :

Public Process Process { get; set;} 
Public string StartingPath { get; set;} 

을 다음과 같은 프로세스를 죽일 :

for (int i = 0; i < runningProcesses.Count; i++) 
{ 
    if (runningProcesses[i].StartingPath == path) 
    { 
      runningProcesses[i].Process.Kill(); 
    } 
} 
관련 문제