首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#和.NET中自动启动java-web-start应用程序,.WaitForExit();无法按预期工作

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

Stack Overflow用户
提问于 2011-02-08 07:14:13
回答 2查看 3.8K关注 0票数 1

我正在使用一个C#应用程序来启动一个java web应用程序。我想让我的C#应用程序知道用户何时关闭java应用程序。我使用的是以下代码:

代码语言:javascript
复制
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应用程序不在我的控制范围之内,所以我不能在那里添加功能。

--

对于任何想知道的人来说,最终的解决方案看起来像这样:

代码语言:javascript
复制
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进程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-15 21:15:03

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

代码语言:javascript
复制
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)

代码语言:javascript
复制
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));
    }
}
票数 5
EN

Stack Overflow用户

发布于 2011-02-09 04:57:43

查看一些文档,您似乎可以将'- wait‘作为参数传递给javaws,使其等待直到应用程序退出。http://download.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/javaws.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4927818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档