저는 많은 하위 프로세스를 시작할 C# 프로그램을 작성하고 있습니다. 나중에 ID로 해당 프로세스를 검색 한 다음 해당 프로세스를 처음 만들 때 사전에 추가 된 사전에 저장된 프로세스 집합과 일치시켜야합니다. 그러나, 나는.NET Frustration - Process.GetProcessById가 새 참조를 반환합니다.
Process notepad = new Process();
notepad.StartInfo.FileName = "notepad";
notepad.Start();
Process n2 = Process.GetProcessById(notepad.Id);
Debug.WriteLine(notepad == n2); //'False', but Why isn't this true???
Debug.WriteLine(notepad.Id == n2.Id); //'True'
... 순수 우스꽝 것 같아 문제로 실행 해요 나는 GetProcessById는 '새로운 프로세스 (...)를'반환 찾아 .NET 리플렉터를 사용했습니다,하지만 이미 실행중인 프로세스에 대한 참조를 찾아 대신 반환해야하는 것처럼 보입니다.
첫 번째 디버그 문을 가정 할 수는 본질적으로
MyCustomDataType 데이터 = 내 사전 [메모장]과 같은 호출입니다;
원래 삽입 한 데이터를 얻으려는 대신 기본 비교기가 참조 검사를 수행하기 때문에 KeyNotFoundException이 표시 될 수 있습니다. 이 문제를 해결하기 위해 사전에 두 개의 Process 개체가 동일한 ID를 갖고 있는지 확인하는 사용자 지정 IComparer를 추가하여 관련 데이터를 예상대로 가져올 수 있습니다. 그러나 이것은 실행되지 않는 프로세스에 프로세스 ID가 없으므로 Process.ID에 대한 내 사용자 지정 IComparer의 호출이 InvalidOperationException을 throw하는 경우가 있습니다. 그래서 한 가지 문제를 해결하기 위해 다른 문제를 수정했습니다.
- 왜 다만 이미 실행중인 프로세스 인스턴스에 대한 참조를 반환 .NET하지 않습니다
그래서, 나는이 개 질문이 됐을까?
- 프로세스 ID를 사용하는 것이 프로세스 개체의 수명 동안 항상 유효한 것은 아니므로 내 사전에 저장된 프로세스와 일치 시키려면 어떻게해야합니까?
안녕하세요 Franci. 당신의 명확한 설명에 대해 너무 고마워요. 대신 '프로세스의 신원을 나타내는 핵심 항목으로 사용 하시겠습니까?' 나는 ID 외에 어떤 내장 된 속성도 생각할 수 없다. 또한 Process가 실행 중인지 여부와 상관없이 Process 객체의 수명 동안 살 수있는 속성이 필요합니다. – Chad
프로세스 ID는 프로세스의 ID를 나타냅니다. :-) 그래서, 당신의 키는 프로세스 ID 여야합니다. 물론, 당신은 분명히 그것과 연관된 Process 객체와 당신이 현재의 사전에 보관하고있는 추가 데이터를 유지하기를 원할 것입니다. 프로세스 개체를 사용하여 사전에 보관 한 데이터를 확장하고 ID로 키를 입력하거나 ID로 키가 입력 된 프로세스 개체를 유지하는 두 번째 사전을 추가 할 수 있습니다. –
프로세스 ID (PID)는 프로세스의 ID를 잘 나타내지 않습니다. 프로세스가 종료되면 나중에 새로운 프로세스에 대해 동일한 PID를 자유롭게 재사용 할 수 있습니다. 프로세스 ID와 프로세스가 시작된 시간의 튜플 (pid 리사이클링 케이스를 처리하기 위해)은 훨씬 더 나은 정체성이다. –