发出正在运行的System.Diagnostics.Process信号以开始关闭程序

时间:2016-02-18 14:28:59

标签: c# system.diagnostics

我有一个特定控制台应用程序的许多实例,它一次性运行&想要通知特定的运行控制台停止处理,以便我可以优雅地关闭它。我看到的大多数选项都会杀死进程,而不是发出信号。

  1. 我已经有了成功杀死进程的代码。
  2. 我希望优雅地告知进程在关闭之前停止处理记录
  3. 进程可能位于当前计算机上,也可能位于另一台计算机上
  4. 我一直在研究各种选择,但有点困惑。所以我不会列出我研究的选项。

    所以我的问题是......

    问:在同一台机器上发出进程信号的最佳选项是什么? 问:在另一台机器上发出进程信号的最佳选项是什么?

1 个答案:

答案 0 :(得分:1)

好的,所以每个人都想要的是这个。

应用程序的设计不受外部应用程序的干扰。 这是应用程序空间。如果不使用某种公共API,应用程序A不应该干扰应用程序B的内部工作。

如果你真的希望它能够这样做,你需要进入DLL注入的领域,这是非常hacky并且不容易实现。

如果您可以控制两个应用程序的代码,我建议您

  1. 使您希望关闭COM的应用程序可见。 (然后,您应该能够使用脚本或代码将其从外部应用程序关闭)
    1. 使用TCPListener类在要关闭的应用程序上打开一个端口。 等待收到关机消息,然后触发内部关机命令。做一个Application.Quit();实际上可以与Process.Kill相同 - 所以如果你有一些非常重要的业务逻辑需要完成,你需要将Application.Quit()包装在你自己的关闭逻辑方法中。
    2. 就像这样:

      App 1 - 启动

      App 1 - 在端口12345上启动TCPListener 应用1 - 开始做业务逻辑

      App 2 - 连接到端口12345上的App1 App 2 - 发送关机命令

      应用1 - 检测关机命令并设置内部变量,说“不再需要开始工作”

      App 1 - 完成最后一个工作项,然后检测到该变量仍然设置为“No more work”,因此在完成当前工作项后关闭该变量。

      只有在您可以控制两个应用程序的代码或者您熟练使用DLL注入和挂钩内部方法时,才能执行此操作。 我在过去已经完成了它,我已经将一个DLL注入到父应用程序中,以创建TCPListener。但是,让它“等待”直到当前工作项完成,同时阻止新项目启动 - 将是主要的复杂因素。