Я пишу программу на c #, которая запускает много дочерних процессов. Через некоторое время мне нужно будет извлечь эти процессы по идентификатору, а затем сопоставить эти процессы с набором процессов, хранящихся в словаре, которые были добавлены в словарь при их первом создании. Однако я сталкиваюсь с проблемой, которая кажется чистой нелепостью ...
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'
Я использовал .NET Reflector, чтобы выяснить, что GetProcessById возвращает «новый процесс (...)», но похоже, что он просто должен найти ссылку на уже запущенный процесс и вместо этого вернуть его.
Вы можете предположить, что первый оператор Debug по сути является вызовом, подобным
MyCustomDataType data = myDictionary [notepad];
Я ожидал бы получить данные, которые я первоначально вставил, вместо этого я получаю исключение KeyNotFoundException, вероятно, потому что компаратор по умолчанию выполняет проверку ссылок. Чтобы противостоять этому, я добавил в свой словарь пользовательский IComparer, который просто проверяет, имеют ли два объекта Process один и тот же идентификатор, чтобы я мог получить связанные данные, как и ожидалось. Однако это имеет свою собственную проблему в том, что процессы, которые не запущены, не имеют идентификаторов процессов, поэтому иногда вызов в моем пользовательском IComparer для Process.ID генерирует исключение InvalidOperationException !!! Итак, я исправил одну проблему только для создания другой.
Итак, я думаю, у меня есть два вопроса:
- Почему .NET не просто возвращает ссылку на уже запущенный экземпляр процесса?
- Что я могу сделать, чтобы соответствовать процессам, хранящимся в моем словаре, поскольку использование идентификатора процесса не всегда допустимо в течение всего времени жизни объекта Process?