Я пишу программу C#, которая запустит многие дочерние процессы. Через некоторое время мне нужно будет восстановить эти процессы по идентификатору, а затем сопоставить эти процессы с набором процессов, хранящихся в словаре, которые были добавлены в словарь при их создании. Тем не менее, я бегу в проблему, которая, кажется, как чистая нелепость ....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'
Я использовал .NET Reflector, чтобы узнать, что GetProcessById возвращает «новый процесс (...)», но похоже, что он должен просто найти ссылку на уже запущенный процесс и вернуть его вместо этого.
Можно предположить, первый оператор Debug, по существу, вызов, как
MyCustomDataType данных = MyDictionary [блокнота];
Я бы ожидал получить данные, которые я первоначально вставил, вместо этого я получаю исключение KeyNotFoundException, вероятно, потому, что по умолчанию сопоставитель выполняет контрольную проверку. Чтобы противостоять этому, я добавил пользовательский IComparer в свой словарь, который просто проверяет, что оба объекта процесса имеют одинаковый идентификатор, поэтому я могу получить связанные данные, как ожидалось. Однако у этого есть своя проблема в том, что Процессы, которые не работают, не имеют идентификаторов процесса, поэтому иногда вызов в моем обычном IComparer для Process.ID вызывает InvalidOperationException !!! Итак, я исправил одну проблему только для создания другой.
Так что, я думаю, у меня есть два вопроса:
- Почему не .NET просто возвращает ссылку на уже запущенный экземпляр процесса?
- Что я могу сделать, чтобы сопоставить процессы, хранящиеся в моем словаре, поскольку идентификатор процесса не всегда действителен для срока службы объекта Process?
Hi Franci. Большое спасибо за ваше четкое объяснение. Что бы вы порекомендовали «использовать в качестве ключа что-то, что представляет собой идентичность процесса»? Я не могу думать о какой-либо встроенной собственности, кроме ID. Кроме того, мне нужно свойство жить для жизни объекта Process независимо от того, запущен ли процесс или нет. – Chad
идентификатор процесса представляет собой представление идентификатора f процесса. :-) Таким образом, ваш ключ должен быть идентификатором процесса. конечно, вы, очевидно, хотите сохранить связанный с ним объект Process и некоторые дополнительные данные, которые вы храните в текущем словаре. У вас есть опции - либо расширьте данные, хранящиеся в словаре, с помощью объекта «Процесс», и введите его идентификатором, либо добавьте второй словарь, в котором вы храните объекты «Процесс» с ключом по идентификатору. –
Идентификаторы процессов (PID) не являются хорошим представлением идентичности процесса. Если процесс завершается, ОС может повторно использовать один и тот же PID для нового процесса позже. Кортеж идентификатора процесса и время начала процесса (для решения проблемы утилизации pid) - гораздо лучшая идентификация. –