C# 在应用程序退出时停止Java进程

C# 在应用程序退出时停止Java进程,c#,java,process,C#,Java,Process,我目前正在尝试编写一个windows窗体应用程序(使用C#),它可以启动和停止多个Java进程(使用参数运行特定的jar文件) 我没有问题启动每个过程;但是,我需要找到一种方法,使应用程序在退出时关闭所有线程,而不管我以哪种方式(数量未知的java进程)在每个工作线程中运行,以避免在应用程序运行时占用主线程(并捕获进程输出) 我看了一下这个: 但它似乎不符合我的目的(它不会关闭流程) 这似乎不符合我的目的。。(它不会关闭进程) 但是它有什么作用呢?它是否至少关闭Java窗口?你的Java应用程序

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

我没有问题启动每个过程;但是,我需要找到一种方法,使应用程序在退出时关闭所有线程,而不管我以哪种方式(数量未知的java进程)在每个工作线程中运行,以避免在应用程序运行时占用主线程(并捕获进程输出)

我看了一下这个:

但它似乎不符合我的目的(它不会关闭流程)

这似乎不符合我的目的。。(它不会关闭进程)

但是它有什么作用呢?它是否至少关闭Java窗口?你的Java应用程序有windows吗

总的来说

  • 如果可能(即,如果您自己构建Java应用程序),您应该在C#和Java应用程序之间设置一种机制,以优雅地向Java应用程序发出关闭信号(套接字等)
  • 否则,如果Java应用程序是图形化的,您仍然可以优雅地关闭它们。这就是您尝试(但失败)的
    Process.CloseMainWindow/Process.Close方法所做的。如果Java应用程序是控制台应用程序,则可以尝试关闭其和/或
  • 最后,当所有其他操作都失败时,使用
    Process.Kill
    来终止您的Java子进程——不快地终止。您可能希望您的控制进程首先尝试1。或2。在上面,等待所有子进程退出,或者等待一段短时间(例如3秒)过去,然后才对尚未退出的进程执行
    Process.Kill
  • 这似乎不符合我的目的。。(它不会关闭进程)

    但是它有什么作用呢?它是否至少关闭Java窗口?你的Java应用程序有windows吗

    总的来说

  • 如果可能(即,如果您自己构建Java应用程序),您应该在C#和Java应用程序之间设置一种机制,以优雅地向Java应用程序发出关闭信号(套接字等)
  • 否则,如果Java应用程序是图形化的,您仍然可以优雅地关闭它们。这就是您尝试(但失败)的
    Process.CloseMainWindow/Process.Close方法所做的。如果Java应用程序是控制台应用程序,则可以尝试关闭其和/或
  • 最后,当所有其他操作都失败时,使用
    Process.Kill
    来终止您的Java子进程——不快地终止。您可能希望您的控制进程首先尝试1。或2。在上面,等待所有子进程退出,或者等待一段短时间(例如3秒)过去,然后才对尚未退出的进程执行
    Process.Kill

  • procrss.kill
    kill方法是一种使进程达到暴力和快速结局的极好方法。Kill方法可以抛出一些异常。但它通常不会也通常会实现你想要的目标,即介于冷血谋杀和快速无痛处决之间。

    procrss.kill
    kill方法是一种使过程达到暴力和快速目的的极好方法。Kill方法可以抛出一些异常。但它通常不会也通常会实现您想要的目标,即介于冷血谋杀和快速无痛的执行之间。

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