C#NET应用程序未关闭Java进程 - c#

我编写了一个C#NET应用程序(作为服务运行的控制台应用程序),该应用程序管理Java进程(Minecraft Game Server),而我们的Web Panel软件则管理我的应用程序。当Java进程停止时,我的应用程序会自行停止,而当我的应用程序停止时,它将停止Java进程。

我遇到的问题是,经过广泛的错误测试后,我将软件部署到了所有机器上,但是似乎遗漏了一个错误,该错误有时无法关闭Java进程。当Web软件尝试启动我的应用程序,我的应用程序尝试启动Java进程时,此错误是可怕的,但是由于无法绑定IP(由于旧进程保持打开状态)而失败,并且最终出现15-30个错误Java进程正在运行。

我正在使用CurrentDomain_UnhandledException来捕获应用程序的崩溃并调用TerminateProcess()。
我正在使用CtrlTypes.CTRL_C_EVENT和CtrlTypes.CTRL_CLOSE_EVENT检测到我的应用程序已关闭,这也调用了TerminateProcess()函数。

我已经尝试了以下两种方法...

static void TerminateProcess()
{
    log.LogMessage("Minecraft Process Shutdown.");
    SendProcessCmd("stop");
}

    static void TerminateProcess()
    {
        log.LogMessage("Minecraft Process Shutdown.");
        minecraftProcess.Kill();
    }

但是,我似乎丢失了关闭C#应用程序的另一种方式,因为这两种方式似乎都会使Java进程偶尔运行一次,而我无法在本地进行复制。

参考方案

好吧,您没有提出任何问题,我想您想问一下可以关闭进程的其他方式,以便您可以拦截它并确保Java进程终止。简而言之:这是不可能的(完全概括)。

只需看看您自己的代码即可:您正在执行与Minecraft完全相同的操作:调用TerminateProcess会使目标进程立即终止,而没有任何机会进行清理。如果有人在您身上呼叫TerminateProcess(例如,用户从“任务管理器”中杀死该进程),则您的进程将立即终止。

另外,某些致命异常是无法捕获的,例如当进程在stack overflow上终止时,不会被告知,而只是终止。

我想您需要创建另一个进程,监视您的进程……(或者重新思考整个体系结构,创建和销毁进程,尤其是使用TerminateProcess时,对我来说似乎有点困难。)

java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…

java.net.UnknownHostException无法连接到ftp - java

我的ftp端口为:ftp://173.201.0.1/我正在尝试通过以下方式将其连接:String Ftp_Path = "ftp://173.201.0.1/"; public List<String> GetFileList() { String ftpServerIP = Ftp_Path; String ftpUser…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…