Я наблюдаю, что 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");
UPDATE: я просто пробовал ждать с 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");
}