Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#NET应用程序未关闭Java进程_C#_Java_.net_Process_Kill - Fatal编程技术网

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

C#NET应用程序未关闭Java进程,c#,java,.net,process,kill,C#,Java,.net,Process,Kill,我编写了一个C#NET应用程序(作为服务运行的控制台应用程序),它管理一个Java进程(Minecraft游戏服务器),我们的Web面板软件管理我的应用程序。当Java进程停止时,我的应用程序会自动停止,当我的应用程序停止时,它会停止Java进程 我遇到的问题是,在进行了大量的bug测试之后,我将软件部署到了我们所有的机器上,但似乎有一个bug我们错过了,它有时并没有关闭Java进程。这个bug非常可怕,因为Web软件试图启动我的应用程序,我的应用程序试图启动Java进程,但由于无法进行IP绑定

我编写了一个C#NET应用程序(作为服务运行的控制台应用程序),它管理一个Java进程(Minecraft游戏服务器),我们的Web面板软件管理我的应用程序。当Java进程停止时,我的应用程序会自动停止,当我的应用程序停止时,它会停止Java进程

我遇到的问题是,在进行了大量的bug测试之后,我将软件部署到了我们所有的机器上,但似乎有一个bug我们错过了,它有时并没有关闭Java进程。这个bug非常可怕,因为Web软件试图启动我的应用程序,我的应用程序试图启动Java进程,但由于无法进行IP绑定而失败(因为旧进程一直处于打开状态),我们最终运行了15-30个有bug的Java进程

  • 我正在使用CurrentDomain\u UnhandledException捕获我的应用程序崩溃并调用TerminateProcess()
  • 我正在使用CtrlTypes.CTRL_C_EVENTCtrlTypes.CTRL_CLOSE_EVENT检测我的应用程序正在关闭,这也调用TerminateProcess()函数
我试过以下两种方法

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


然而,我似乎错过了关闭我的C#应用程序的另一种方式,因为这两种方式似乎都会让Java进程每隔一段时间运行一次,而我无法在本地进行复制。

好吧,您并没有说明任何问题,我猜您想问一个进程关闭的其他方式,这样您就可以拦截它并确保Java进程终止。简单地说:这是不可能的

只要看看你自己的代码:你对Minecraft做的事情完全一样:调用TerminateProcess会导致目标进程立即终止,而没有任何清理的机会。如果有人打电话给您(例如,用户从Task Manager终止了流程),您的流程将立即终止

此外,一些致命的异常是不可修补的,例如,当进程在某个服务器上死亡时,您没有被告知,只是被终止了


我想你需要创建另一个进程,监视你的进程…(或者重新思考整个体系结构,创建和终止进程,尤其是TerminateProcess,对我来说似乎有点粗糙。)

你是说log.LogMessage(“Minecraft进程关闭”);你没打电话吗?服务包装中可能有问题?相反,将应用程序修改为服务和控制台它似乎总是被调用,但并不总是停止进程。你能解释一下服务和控制台是什么意思吗?在我启动Java进程之后,我会保持我的进程打开一段时间(minecraftProcess.haseExitd==false),这似乎很好。我能说的最好的是,当它返回真值时,我的总是关闭。是否有一种更干净的方法来关闭Java进程而不是对其使用Kill()?“Stop”是用于优雅地关闭进程的命令。我假设最好的方法是发出“停止”,然后睡眠X秒,检查它是否仍在运行,如果是的话,杀死它。这是最好的方法吗?没有单一的通用方法“要求”另一个进程干净地终止。如果“停止”是您的具体案例中的方法,那么是的,无论如何,尝试它,并且只有当它不起作用时,才使用Kill。(还要注意,使用
while(something);
进行繁忙等待不是一种好的编程风格。使用
process.WaitForExit(timeout)
    static void TerminateProcess()
    {
        log.LogMessage("Minecraft Process Shutdown.");
        minecraftProcess.Kill();
    }