プロセスがまだ実行されているにもかかわらず、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()
更新:ポーリングループの代わりに待機しようとしましたが、結果はまったく同じです。
追加:上記のコードは、「より明確な」問題を同様に示すためだけのものでした。明確にするために; 私の問題は、それがtrueProcess.GetProcessesByName( "testprogram" );
に設定された後でも、プロセスを保持できるということではありません。HasExited
本当の問題は、私が外部で実行しているプログラムが、ファイルを(正常に)終了する直前に書き込むことです。私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");
}