我正在使用C#应用程序来启动Java Web应用程序。我希望我的C#应用程序知道用户什么时候关闭了Java应用程序。我使用此代码:从C#和.NET自动启动java-web-start应用程序,.WaitForExit();无法正常工作
var javaws = File.Exists(@"C:\Program Files\Java\jre6\bin\javaws.exe") ? @"C:\Program Files\Java\jre6\bin\javaws.exe" : @"C:\Program Files (x86)\Java\jre6\bin\javaws.exe";
var psi = new ProcessStartInfo(javaws, String.Format("http://{0}:/appstart.jnlp", hostAddress));
Process.Start(psi).WaitForExit();
此代码成功启动java程序,但是,WaitForExit()
被调用,并立即返回。我相信这是因为“javaws”只是启动另一个名为“javaw”的进程,然后“javaws”关闭。是否有任何方法可以A)等待所有子进程完成,或者B)等待特定的子进程?
-
我发现这个相关的职位:Are javaws exit codes really broken?,虽然答案有暗示1.6.0_23已经修好了,我看到完全相同的行为我的开发机器上使用Java 1.6.0_23。我正在寻找的是一种解决方法,使上面的代码按预期工作。我需要启动这个jnlp文件,等待它的执行完成,然后在C#程序中做一些额外的代码。 Java应用程序超出了我的控制范围,所以我无法在其中添加功能。
-
大家很奇怪,最终的解决方案是这样的:
var javaws = File.Exists(@"C:\Program Files\Java\jre6\bin\javaws.exe") ? @"C:\Program Files\Java\jre6\bin\javaws.exe" : @"C:\Program Files (x86)\Java\jre6\bin\javaws.exe";
var psi = new ProcessStartInfo(javaws, String.Format("http://{0}:/appstart.jnlp", hostAddress));
Process.Start(psi).WaitForExit();
var javaw = Process.GetProcessesByName("javaw");
javaw.Single(ja => ja.StartTime.Equals(javaw.Max(j => j.StartTime))).WaitForExit();
这提供的只是等待最近启动的javaw
过程中,事件的额外好处还有其他在机器上运行的java web应用程序。
我测试@ rotman的解决方案,它的工作原理。 – Pat 2011-02-15 15:44:52