我正在使用一个C#应用程序来启动一个java web应用程序。我想让我的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“只是启动了另一个称为”javaw.“的进程,然后"javaws”关闭了。有没有办法A)等待所有子进程也完成,或者B)等待特定的子进程?
--
我发现了这篇相关的文章:Are javaws exit codes really broken?,虽然答案表明1.6.0_23已经修复了它,但我在我的开发机器上看到了与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();这提供了附加的好处,即在机器上运行有其它java web应用的情况下,仅等待最近启动的javaw进程。
发布于 2011-02-15 21:15:03
您可以从正在运行的进程列表中获取所需的进程,然后等待它退出:
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));
// make sure child process is already started
Process.Start(psi).WaitForExit();
foreach (Process p in Process.GetProcessesByName("javaw"))
{
p.WaitForExit();
}不仅要杀死javaws,而且要杀死所有子进程,您需要获取javaws的进程ID,并将其与所有正在运行的进程的父进程ID进行比较。下面是完整的代码:(扩展方法来自here)
class Program
{
static void Main(string[] args)
{
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));
var parentProc = Process.Start(psi);
parentProc.WaitForExit();
foreach (Process p in Process.GetProcesses())
{
if (p.Parent().Id == parentProc.Id)
p.WaitForExit();
}
}
}
public static class ProcessExtensions
{
private static string FindIndexedProcessName(int pid)
{
var processName = Process.GetProcessById(pid).ProcessName;
var processesByName = Process.GetProcessesByName(processName);
string processIndexdName = null;
for (var index = 0; index < processesByName.Length; index++)
{
processIndexdName = index == 0 ? processName : processName + "#" + index;
var processId = new PerformanceCounter("Process", "ID Process", processIndexdName);
if ((int)processId.NextValue() == pid)
{
return processIndexdName;
}
}
return processIndexdName;
}
private static Process FindPidFromIndexedProcessName(string indexedProcessName)
{
var parentId = new PerformanceCounter("Process", "Creating Process ID", indexedProcessName);
return Process.GetProcessById((int)parentId.NextValue());
}
public static Process Parent(this Process process)
{
return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id));
}
}发布于 2011-02-09 04:57:43
查看一些文档,您似乎可以将'- wait‘作为参数传递给javaws,使其等待直到应用程序退出。http://download.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/javaws.html
https://stackoverflow.com/questions/4927818
复制相似问题