我一直在观察,即使进程仍在运行,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");
}