【问题标题】:Stop Java process on application exit在应用程序退出时停止 Java 进程
【发布时间】:2012-11-18 17:34:43
【问题描述】:

我目前正在尝试编写一个 Windows 窗体应用程序(用 C# 编写),它可以启动和停止多个 Java 进程(带有运行特定 jar 文件的参数)。

启动每个进程都没有问题;但是我需要找到一种方法让应用程序在退出时关闭所有这些应用程序,无论采用哪种方式(作为未知数量的 Java 进程),我都在一个单独的工作线程中运行,以避免占用主线程同时应用程序正在运行(并捕获进程输出)。

我看过这个:Close another process when application is closing

但它似乎不适用于我的目的(它不会关闭进程)。

【问题讨论】:

  • 你试过 process.Kill() 吗?
  • 你能给出不起作用的示例代码吗?

标签: c# java process


【解决方案1】:

它似乎不适用于我的目的..(它不会关闭进程)。

但是它有什么作用呢?它是否至少关闭了 Java 窗口?您的 Java 应用程序是否有 个窗口?

一般来说,

  1. 如果可能(即如果您自己构建 Java 应用程序),您应该在您的 C# 和 Java 应用程序之间建立一个机制,以优雅地通知 Java 应用程序关闭(套接字等)李>
  2. 如果不这样做,您仍然可以正常关闭 Java 应用程序,如果它们是图形的,by sending WM_CLOSE。这就是您尝试(但失败)的Process.CloseMainWindow/Process.Close 方法的作用。如果您的 Java 应用程序是控制台应用程序,您可以尝试关闭其/它们的standard input 和/或simulating ^C
  3. 最后,当所有其他方法都失败时,使用Process.Kill 来终止您的Java 子进程——不优雅。您可能希望您的控制进程首先尝试上面的 1. 或 2.,等到所有子进程都退出或直到经过很短的时间(例如 3 秒),然后才在任何进程上继续使用 Process.Kill尚未退出。

【讨论】:

  • 我在这里运行测试只是 minecraft_server.jar (minecraft.net/download) 它似乎没有做任何事情,我在隐藏窗口的情况下开始了这个过程(因为它是一个控制台无论如何,我将重定向输入/输出到我的应用程序),关闭应用程序后,我仍然运行“java.exe”。现在我不在乎它是否优雅,我最终将通过向 java 进程输入发送一个命令来实现它(即我的世界服务器的“停止”)
  • 好的,那么CloseMainWindow 将不起作用。将stop 命令发送到其标准输入不起作用吗? (您的管道是否一开始就设置正确?)如果不是,那么现在只需 Process.Kill 它,然后对管道进行故障排除并稍后处理继承。
  • 经过更多调试后,我得到了stackoverflow.com/questions/943681/… 工作(并将它们放在单独的线程中)但是,似乎当我让它们在自己的窗口中打开(而不是隐藏它)时,它会按预期关闭它们,但是当我使用时: myProcessInfo.CreateNoWindow = true;让它们隐藏起来,然后它们就不会停止。
【解决方案2】:

procrss.killKill 方法是一种极好的方法,可以使进程以暴力和迅速的方式结束。 Kill 方法可以抛出一些异常。但它通常不会而且通常会实现你想要的目标——介于冷血谋杀和快速无痛处决之间。

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多