gpt4 book ai didi

c# - 即使进程正在运行,Process.HasExited 也会返回 true?

转载 作者:IT王子 更新时间:2023-10-29 04:11:20 27 4
gpt4 key购买 nike

我一直在观察 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");
}

最佳答案

我意识到这是一篇旧帖子,但在我寻求找出为什么我的应用程序甚至在应用程序打开之前运行 Exited 事件的过程中,我发现了一些我认为可能对将来遇到此问题的人有用的东西。

当一个进程启动时,它会被分配一个 PID。 如果随后出现“用户帐户控制”对话框提示用户并选择"is",则进程将重新启动并分配一个新的 PID。

我坐了几个小时,希望这可以节省一些人的时间。

关于c# - 即使进程正在运行,Process.HasExited 也会返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com