AvaloniaUI 应用程序退出时如何正确终止 Java 子进程?

问题描述 投票:0回答:1

在我的 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 的关闭事件中我也有

Process?.Kill();

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

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

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

c# process kill-process avaloniaui
1个回答
0
投票

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

您有两个应用程序,一个使用 C#,另一个使用 Java。 Java 应用程序依赖于 c# 应用程序,并且在任何情况下 c# 应用程序死亡,Java 应用程序也将死亡。

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

解决方案1:

在 Java 应用程序中实现轮询调度程序,该程序每 30 秒对 C# 应用程序执行一次简单的运行状况检查,例如如果健康检查结果是否定的,请停止 Java 应用程序。

解决方案2:

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

解决方案3:

在您的基础设施中创建第三个应用程序来执行运行状况检查。

解决方案4:

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

© www.soinside.com 2019 - 2024. All rights reserved.