gpt4 book ai didi

c# - 从 C# 和 .NET 自动启动 java-web-start 应用程序,.WaitForExit();不按预期工作

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:14 24 4
gpt4 key购买 nike

我正在使用 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 已修复它,但我在使用 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 应用程序。

最佳答案

您可以从正在运行的进程列表中获取所需的进程,然后等待它退出:

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();
}

不仅要杀死 javaw,而且要杀死所有子进程,您需要获取 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));
}
}

关于c# - 从 C# 和 .NET 自动启动 java-web-start 应用程序,.WaitForExit();不按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com