关闭托管流程的最佳方式

时间:2013-03-19 16:11:19

标签: c# process .net-3.5 kill

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

我正在将进程A id作为arg发送到进程b并执行:

Process.GetProcessById(processId).WaitForExit();

这很好用。
我的问题是如果处理死亡,如何正确地杀死进程b?

我尝试了以下所有方法:

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

唯一有效的是:

Process.GetCurrentProcess().Kill();

但是不是杀死这个过程太残酷了?

添加代码:
主要处理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();

    }

2 个答案:

答案 0 :(得分:1)

Environment.Exit()不清洁吗?

答案 1 :(得分:0)

没有更清洁的版本,我只是简单地调用我的Dispose方法 它关注所有事情,例如关闭的WCF服务 最后是Process.GetCurrentProcess()。Kill();