2015-07-08 3 views
2

Когда программа копируется во многих местах, а затем запускается независимо друг от друга, иногда может появиться сообщение об ошибке:Как безопасно получить идентификатор процесса после процесса. Start()?

ProcessStartInfo startInfo = new ProcessStartInfo(exePath); 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.ErrorDialog = false; 

Process process = new Process() { StartInfo = startInfo }; 
bool isStarted = process.Start(); 
int processId = process.Id; // Failed as bellow When the isStarted is false 

System.InvalidOperationException: Никакой процесс не связан с этим объекта.

+0

Возможный дубликат [получение PID процесса, начатого Process.start()] (http://stackoverflow.com/questions/12892268/getting-pid-of-process-started-by-process-start) –

+0

Не та же проблема. – King

+0

Скорее всего, ваш процесс начался, но столкнулся с немедленным сбоем, как необработанное исключение, и немедленно прекратился. В этом случае флаг bool для 'IsStarted' будет установлен в false, и вы не получите идентификатор процесса. Если вы действительно действительно нуждаетесь в этом, я бы предположил, что вам может понадобиться какой-то драйвер для подписки на вызов ядра ядра процесса. В противном случае вам может быть не повезло. В большинстве ситуаций вам не нужно действительно пытаться запустить процесс. – oleksii

ответ

1

Поскольку вы запускаете файлы EXE, вам не нужна функция UseShellExecute. По какой-то непостижимой причине по умолчанию установлено значение UseShellExecute. Использование его влечет за собой большую сложность.

Установить UseShellExecute на false и Start должно всегда возвращаться true. Затем идентификатор всегда должен быть действительным. Обязательно удалите экземпляр Process.

Смежные вопросы