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

标签 c# .net java-web-start system.diagnostics

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

相关文章:

c# - Entity Framework Code First 复合键上的一对一关系

时间:2019-03-08 标签:c#filesystemwatcher and backgroundworker

c# - WinForms:BackgroundImage 嵌入为位图?

.net - VS 2005 可以为 .NET 4 构建 C# 吗?

java - Eclipse构建>签名Jar>Jnlp部署流程

java - 在没有插件的情况下从浏览器运行 Java 程序

c# - ASP.NET 5 类库可以面向 .NET 3.5 吗?

c# - 全屏模式,但不要覆盖任务栏

c# - 按名称而不是按索引查找 DataTable 中的列是否会增加开销?

java - 取消 Java Webstart 自定义下载