Как использовать Process.WaitForExit - PullRequest
2 голосов
/ 14 июня 2011

Я звоню в приложение третьей части, которое «иногда» работает в VB.NET (это самодостаточный WCF).Но иногда стороннее приложение будет зависать вечно, поэтому я добавил к нему 90-секундный таймер.Проблема в том, как узнать, истек ли срок действия вещи?

Код выглядит следующим образом:

Dim MyProcess as System.Diagnostics.Process = System.Diagnostics.Process.Start(MyInfo)
MyProcess.WaitForExit(90000)

Я хотел бы сделать что-то вроде этого

If MyProcess.ExceededTimeout Then
    MyFunction = False
Else
    MyFunction = True
End If

Есть идеи?

Спасибо,

Джейсон

Ответы [ 3 ]

5 голосов
/ 14 июня 2011

В прошлом были известные проблемы, когда приложения зависали при использовании WaitForExit.

Вам нужно использовать

dim Output as String = MyProcess.StandardOutput.ReadToEnd()

перед звонком

MyProcess.WaitForExit(90000)

См. Фрагмент кода Microsoft:

// Start the child process.
 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

4 голосов
/ 14 июня 2011

Проверьте возвращаемое значение метода - http://msdn.microsoft.com/en-us/library/ty0d8k56.aspx - если время ожидания истекло, он вернет значение False.

1 голос
/ 06 февраля 2013
if(process.WaitForExit(timeout)) {
    // user exited
} else {
    // timeout (perhaps process.Kill();)
}

Асинхронный запуск процесса и ожидание его завершения

...