Я использую приложение C # для запуска веб-приложения Java. Я хотел бы, чтобы мое приложение на 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();
Этот код успешно запускает Java-программу, однако вызывается WaitForExit()
и немедленно возвращается. Я полагаю, что это потому, что «javaws» просто запускает другой процесс под названием «javaws», а затем «javaws» закрывается. Есть ли способ а) дождаться завершения всех дочерних процессов или б) дождаться определенного дочернего процесса?
-
Я обнаружил этот связанный пост: Действительно ли коды выхода javaws неработоспособны? , хотя ответ там предполагает, что 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.