当AvaloniaUI应用程序退出时,如何正确杀死子Java进程?

How to properly kill the child Java process when AvaloniaUI app is exiting?

提问人:Nortia 提问时间:11/16/2023 最后编辑:Nortia 更新时间:11/17/2023 访问量:46

问:

在我的 AvaloniaUI 应用程序中,我将 Java 应用程序作为进程运行。

private static Process _process;

string command = $"-jar \"{jar}\"";

ProcessStartInfo startInfo = new("java", command)
{
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    UseShellExecute = false,
    CreateNoWindow = true,
};

((IClassicDesktopStyleApplicationLifetime)Application.Current.ApplicationLifetime).Exit += (s, e) =>
{
    try { _process?.Kill(); } catch { }
};

_process = new()
{
    StartInfo = startInfo
};



_process.OutputDataReceived += OnDataReceived;
_process.Start();

在 MainWindow 的 Closing 事件中,我也有。Process?.Kill();

但是,有时它不起作用,例如,当我的应用程序从任务管理器中终止时。

我该如何解决?我在这里找到了一些解决方案,但它们需要 Windows - 我也需要对 Linux 和 macOS 的支持。

我宁愿不编辑 Java 应用程序代码。

C# 进程 kill-process avaloniaui

评论

0赞 David Weber 11/16/2023
这不是 Java 代码。
0赞 David Weber 11/16/2023
获取进程 ID (PID),将其另存为变量,然后使用此 PID 终止进程。
0赞 Nortia 11/16/2023
@DavidWeber “在我的应用程序中,我将 Java 应用程序作为进程运行。”在我的 C# 应用程序中,我将 Java 应用程序作为进程运行。
0赞 Nortia 11/16/2023
@DavidWeber这不会改变任何事情,如果我的应用程序已关闭,则应用程序“没有时间”对该过程执行任何操作
0赞 David Weber 11/17/2023
如果您的应用程序已关闭,则有时间执行某些操作。在 exit 事件中终止 Java 进程。WinForms:订阅 Application.ApplicationExit 事件,并在事件处理程序中执行关闭代码。WPF:订阅 Application.Exit 事件,并在事件处理程序中执行关闭代码。

答:

0赞 David Weber 11/17/2023 #1

您尝试存档的是运行时不同应用程序之间的一种动态通信。

您有两个应用程序,一个是 c#,另一个是 Java 应用程序。Java 应用程序依赖于 c# 应用程序,在任何情况下,c# 应用程序都会死亡,Java 应用程序也会死亡。

没有解决方案,只有框架。

解决方案 1:

在 Java 应用中实现轮询调度程序,该调度程序每 30 秒对 c# 应用执行一次简单的运行状况检查,例如,如果运行状况检查为阴性,则停止 Java 应用。

解决方案 2:

尝试在 c# 应用程序中创建一个独立线程,该线程在应用程序本身的进程终止后“幸存下来”。此线程应计划每 30 秒对 c# 应用进行一次简单的运行状况检查。

解决方案 3:

创建一个在 c# 应用中启动的脚本,用于执行运行状况检查作业。

解决方案 4:

在基础结构中创建第三个应用程序来执行运行状况检查。

解决方案 5:

使用第三方工具执行此操作。有一些工具可以处理微服务,这是相同的原理。

使用 docker-compose 给出的 Docker 示例:

docker-compose up --abort-on-container-exit

如果只有一个容器停止,这将停止所有正在运行的容器。无需轮询实现。

缺点:仅当您可以以某种方式将其应用于 Java 应用程序是从 c# 应用程序启动这一事实时才有效