java返回hasExited,Process.HasExited返回true,即使进程正在运行?

I have been observing that Process.HasExited sometimes returns true even though the process is still running.

My code below starts a process with name "testprogram.exe" and then waits for it to exit. The problem is that sometimes I get thrown the exception; it seems that even though HasExited returns true the process itself is still alive in the system - how can this be??

My program writes to a log file just before it terminates and thus I need to be absolutely sure that this log file exists (aka the process has terminated/finished) before reading it. Continuously checking for it's existence is not an option.

// 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: I just tried waiting with process.WaitForExit() instead of the polling loop and the result is the exact same.

Addition: The above code was only to demonstrate a 'clearer' problem alike. To make it clear; my problem is NOT that I still can get a hold of the process by Process.GetProcessesByName( "testprogram" ); after it set HasExited to true.

The real problem is that the program I am running externally writes a file -just before- it terminates (gracefully). I use HasExited to check when the process has finished and thus I know I can read the file (because the process exited!), but it seems that HasExited returns true even sometimes when the program has NOT written the file to disk yet. Here's example code that illustrates the exact problem:

// 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");

}

解决方案

I realize this is an old post, but in my quest to find out why my app running the Exited event before the app had even opened I found out something that I though might be useful to people experiencing this problem in the future.

When a process is started, it is assigned a PID. If the User is then prompted with the User Account Control dialog and selects 'Yes', the process is re-started and assigned a new PID.

I sat with this for a few hours, hopefully this can save someone time.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值