Process.HasExited возвращает true, даже если процесс запущен? - PullRequest
30 голосов
/ 26 марта 2010

Я заметил, что 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");
}

Ответы [ 11 ]

0 голосов
/ 18 апреля 2014

Если у вас есть веб-приложение, и ваша внешняя программа / процесс генерирует файлы (запись на диск), проверьте, есть ли у вашего IIS права на запись в эту папку, если не в свойствах добавить разрешение безопасности для вашего пользователя IIS, именно поэтому в моем случае я получал process.HasExited = true, но созданные файлы из процесса не были завершены, после некоторого затруднения я добавляю полные права доступа к папке, в которой находился процесс и process.Refresh (), как описано выше в Zarathos. и все работало как положено.

...