Я заметил, что Process.HasExited
иногда возвращает true
, даже если процесс все еще выполняется.
Мой код ниже запускает процесс с именем "testprogram.exe" и ждет его завершения. Проблема в том, что иногда я получаю исключение; кажется, что даже если HasExited
возвращает true
, сам процесс все еще жив в системе - как это может быть ??
Моя программа записывает в файл журнала непосредственно перед его завершением, и, таким образом, я должен быть абсолютно уверен, что этот файл журнала существует (иначе процесс завершился / завершился), прежде чем читать его. Постоянно проверять его существование не вариант.
// Create new process object
process = new Process();
// Setup event handlers
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputDataReceivedEvent;
process.ErrorDataReceived += ErrorDataReceivedEvent;
process.Exited += ProgramExitedEvent;
// Setup start info
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = ExePath,
// Must be false to redirect IO
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = arguments
};
process.StartInfo = psi;
// Start the program
process.Start();
while (!process.HasExited)
Thread.Sleep( 500 );
Process[] p = Process.GetProcessesByName( "testprogram" );
if ( p.Length != 0 )
throw new Exception("Oh oh");
ОБНОВЛЕНИЕ: Я только что попытался ждать с process.WaitForExit()
вместо цикла опроса, и результат точно такой же.
Дополнение: приведенный выше код предназначен только для демонстрации более «ясной» проблемы. Чтобы было понятно; моя проблема НЕ в том, что я все еще могу удержать процесс на Process.GetProcessesByName( "testprogram" );
после того, как для HasExited
установлено значение true.
Настоящая проблема заключается в том, что программа, которую я запускаю, внешне записывает файл - только до того, как он завершает работу (изящно). Я использую HasExited
, чтобы проверить, когда процесс завершился, и, таким образом, я знаю, что могу прочитать файл (потому что процесс завершился!), Но кажется, что HasExited
возвращает true
даже иногда, когда программа НЕ записала файл на диск еще. Вот пример кода, который иллюстрирует точную проблему:
// Start the program
process.Start();
while (!process.HasExited)
Thread.Sleep( 500 );
// Could also be process.WaitForExit(), makes no difference to the result
// Now the process has quit, I can read the file it has exported
if ( !File.Exists( xmlFile ) )
{
// But this exception is thrown occasionally, why?
throw new Exception("xml file not found");
}