繁体   English   中英

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

[英]C# NET Application not shutting down Java Process

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

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

  • 我正在使用CurrentDomain_UnhandledException来捕获应用程序的崩溃并调用TerminateProcess()。
  • 我正在使用CtrlTypes.CTRL_C_EVENTCtrlTypes.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 (例如,从任务管理器中杀死该进程的用户),您的进程将立即终止。

另外,某些致命异常是无法捕获的,例如,当您的进程死于堆栈溢出时 ,不会被告知,只是终止了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM