【问题标题】:C# gracefully close a separate application that has no UIC#优雅地关闭一个没有UI的单独应用程序
【发布时间】:2016-12-05 12:56:21
【问题描述】:

我使用 c# 进程类打开一个没有 GUI 的单独应用程序。这是一个 c++ 项目,我使用 Process.Kill() 来结束它。问题是这并没有给它一个机会来完成它的行动。 Process.Close() 只是在我的主应用程序中释放对象并让单独的应用程序运行。

让这个过程优雅地结束的最好方法是什么?

【问题讨论】:

  • 该类应该有一个 Dispose() 方法,该方法执行清理并关闭任何需要关闭(或停止运行)的对象。
  • 我认为你不应该使用 Process.Kill()。而是在两个应用程序之间发送消息(udp...),并在完成其操作时终止。
  • @jdweng 你知道你说的和主题无关吗?
  • @Sam 这里最重要的问题是:C++ 项目也是你的项目吗?您有权访问源代码吗?如果您可以修改该工具:进程间通信有许多选项,从通过 TCP 通信到命名管道的 UDP 通信开始。如果在过去发现设计我的工具很容易,那么我可以通过标准输入向它们发送命令。然后,在 C# 中,将“关闭”命令写入工具的标准输入,以便工具知道它应该退出。

标签: c# c++ process


【解决方案1】:

过去我需要从 GUI C# 工具启动非 GUI C# 工具,这两个工具都是我编写的。我使用标准输入/输出流在两个工具之间进行通信。

您可以让您的 C++ 工具在其stdin 上监听指​​示该工具应该正常退出的命令。然后,在您的 C# 应用程序中,发送退出命令,等待一段合理的时间,如果到那时该工具还没有结束,则终止它。

很抱歉,我的 C++ 不够好,无法为您提供 C++ 方面的示例,但在我的 C# 项目中使用以下几行来告诉外部进程结束:

m_consoleProcess.StandardInput.WriteLine("QUIT");
m_consoleProcess.WaitForExit(10000);
if (!m_consoleProcess.HasExited)
{
     m_consoleProcess.Kill();
}

如果您需要管理单独的外部进程,当然您需要为每个进程存储一个Process 实例,并且您必须处理外部进程在您的应用程序退出之前结束的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多