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

标签 c# java .net process kill

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

我遇到的问题是,在进行了大量的错误测试后,我将软件部署到了我们所有的机器上,但我们似乎错过了一个错误,它有时不会关闭 Java 进程。这个错误非常可怕,因为 Web 软件尝试启动我的应用程序,我的应用程序尝试启动 Java 进程,但由于无法绑定(bind) 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对于您(例如,用户从任务管理器终止进程),您的进程会立即终止。

此外,一些致命异常是无法捕获的,例如当你的进程在 stack overflow 上终止时,你没有被告知,只是终止了。

我猜你需要创建另一个进程,监视你的进程......(或者重新思考整个架构,创建和终止进程,特别是使用 TerminateProcess,对我来说似乎有点粗糙。)

关于C# NET 应用程序未关闭 Java 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908469/

相关文章:

.net - 从 SQL Server 到 Entity Framework 的函数导入运行时异常

c# - 如何在 WinRT 中的按钮中将文本放置在图像上

java - 如果存在两条以上记录,则从数据库获取数据

c# - WinRT - MessageDialog.ShowAsync 将在我的自定义类中抛出 UnauthorizedAccessException

java - 序列化多层 XML 元素

java - Autowired 不会为相同类型的多个 bean 抛出异常

mysql - 从实体类创建mysql数据库

C#:遍历对象图时避免无限递归

c# - 如何使用 C# 从数据库中读取数组字段?

java - C# 获取扩展基类的类列表