我正在使用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