Возможно, это не самое элегантное решение, но косвенно вы можете сделать это, проверив, существует ли процесс или нет, а затем сделайте это повторяемым.Это, конечно, если у вас еще нет дескриптора процесса.
void checkProcess()
{
Process[] processes = Process.GetProcessesByName("NameOfProcess");
if (processes.Length == 0)
{
// No such process
}
else
{
foreach (Process proc in processes)
{
// do something with proc
}
}
}
Изменить: Некоторые мысли по этому поводу после прочтения постов в ответ Абдул плюс ваш собственный вопрос.Это ни в коем случае не ответ, но, возможно, он может помочь вам в ваших поисках.
Во-первых, Activator.CreateInstance вызывает конструктор наилучшего соответствия для типа объекта, который вы ему передаете, и возвращает дескриптор этого объекта.Он сам создает потоки / процессы и поэтому не знает о них.(9) процессы, которые вы увидите в своем списке, вероятно, созданы самим классом Rheno4.Здесь обсуждается здесь .
Во-вторых, согласно msdn свойство EnableRaisingEvents должно быть установлено в значение true, когда процесс создается для события Exited для функционированияправильно.Это заставляет меня задуматься о том, что происходит, когда вы присоединяете событие после того, как процесс уже создан?
Конечно, вы можете перебирать все соответствующие процессы до и после вызова CreateInstance, чтобы извлечь все новые экземпляры Rheno4, которые были созданы.Но это далеко не пуленепробиваемое решение, и есть риск, что вы выбираете процессы, созданные кем-то другим, или что не все процессы извлекаются (в случае задержки при создании другого объекта).Однако в зависимости от ваших потребностей это может быть применимо.
Еще одна мысль.Процессы, возвращаемые из GetProcessesByName, имеют богатый набор свойств .Может быть, вы можете посмотреть через них и найти общий знаменатель для возвращаемых процессов.Те, которые я бы начал исследовать: Threads, StartInfo, MainModule.