2013-08-01 3 views
4

Я начинаю новый процесс, используя следующий код:InvalidOperationException с процессом

Process p = new Process(); 
p.StartInfo.FileName = "..."; 
p.StartInfo.Arguments = "..."; 
p.Start(); 
p.WaitForExit(300000); // 5 minutes 

if (!p.HasExited) 
    p.Kill(); 
Console.Write(p.ExitCode); 

Когда процесс завершается в течение 5 минут, что это работает, но когда это не так, я получаю

InvalidOperationException (процесс должен выйти до запроса информация может быть определена ...).

Любая идея, почему я получаю это исключение?

спасибо.

+0

Ваша ошибка, потому что процесс должен выйти перед запросами ... Это ваш процесс? возможно, стоит выяснить, почему он занимает больше времени, чем вы ожидаете, где происходит ошибка. – Sayse

+0

Нет, это не мой процесс. –

ответ

10

Согласно MSDN, «Метод Kill выполняется асинхронно. После вызова метода Kill, вызовите метод WaitForExit ждать процесс, чтобы выйти, или проверить HasExited свойство, чтобы определить, если процесс завершился.»

Другими словами, только потому, что возврат Kill не означает, что процесс фактически исчез. Вам нужно будет позвонить WaitForExit, чтобы подождать, пока процесс фактически не исчезнет.

+4

У меня были проблемы с исключением, которое все еще происходит после 'WaitForExit()'. Только 'while (! Process.HasExited) Thread.Sleep (5);' спас меня в конце. Вы думаете, что это именно то, что делает 'WaitForExit()', но, по-видимому, нет. – Nyerguds

+0

Может быть редким условием гонки, то есть ядро ​​предварятельно отмечает процесс как завершенный до завершения очистки. –

+0

Конечно, если все остальное не удается, вы всегда можете определить 'Int32? exitcode = null; 'после' p.WaitForExit() ', а затем создать цикл while (! exitCode.HasValue), содержащий try-catch, который извлекает' p.ExitCode' в этот nullable var, ловит только InvalidOperationException, и имеет 5 миллисекундный поток сна в 'catch'. – Nyerguds

-1

Некоторые свойства процесса (такие как HasExited) могут быть определены только после завершения процесса. Отсюда и ошибка.

Я бы предложил иметь блок try/catch, чтобы получить исключение.

+2

Было бы бесполезно, если 'HasExited' был доступен * только после того, как процесс завершился *, вам не кажется? Вероятно, проблема заключается в том, что Kill() не является синхронным методом, а 'ExitCode' не доступен сразу после его вызова, поскольку процесс на самом деле еще не мертв *. – KappaG3

+2

В чем смысл свойства HasExited, если мы можем использовать его только при выходе из процесса? –

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