【问题标题】:best way to close hosted process关闭托管进程的最佳方法
【发布时间】:2013-03-19 16:11:19
【问题描述】:

我有启动进程 B 的进程 A。
他们在 WCF(IAsyncResult APM 模式)中进行通信,A 是客户端 B 是服务。
当进程 A 死亡时,我需要关闭 B。

我将进程 A id 作为 arg 发送给进程 b,他这样做了:

Process.GetProcessById(processId).WaitForExit();

这工作正常。
我的问题是如果进程 a 死亡,如何正确终止进程 b?

我尝试了以下所有方法:

Process.GetCurrentProcess().Close();
Process.GetCurrentProcess().Dispose();
Application.Exit(); > its a guiless winform application

唯一有效的是:

Process.GetCurrentProcess().Kill();

但是杀死进程是不是太残忍了?

添加代码:
main 中的进程 B:

TrackExternalProcess(externalProcessId, () => { OnExternalProcessClosed(); });

公共方法:

    public static void TrackExternalProcess(int processId, Action onExternalProcessClosed)
    {
        new Thread(new ThreadStart(delegate
        {
            try
            {
                Thread.CurrentThread.IsBackground = true;
                Process.GetProcessById(processId).WaitForExit();

                logger.Error("Host process quit unexpectedly");

                onExternalProcessClosed();
            }
            catch (Exception)
            {
            }
        })).Start();
    }

    public static void OnExternalProcessClosed()
    {
        Process.GetCurrentProcess().Kill();

    }

【问题讨论】:

  • 如果在 B 中,您不尝试做任何事情 - 而只是做 Application.Start();,会发生什么情况,如果 A 终止,它会自行终止吗?
  • 没有Application.Start()。
  • 使用 Kill() 很好,而且不像你说的那样太残忍。我会为进程 A 创建一个事件处理程序,以了解它何时关闭或中止:msdn.microsoft.com/en-us/library/…
  • @PmanAce 跨进程事件?
  • 您是否考虑过让进程 B 轮询进程 A 而不是 A 必须指示失败?

标签: c# process .net-3.5 kill


【解决方案1】:

Environment.Exit() 不是更干净吗?

【讨论】:

  • 谢谢。这可能对进一步的开发有用
【解决方案2】:

没有更简洁的版本,我只是调用了我的 Dispose 方法。
它照顾一切,例如关闭的 WCF 服务。
最后是 Process.GetCurrentProcess().Kill();

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 2014-04-08
    • 1970-01-01
    • 2010-11-15
    • 2011-05-16
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多