【发布时间】: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 必须指示失败?