【发布时间】:2016-07-06 01:58:40
【问题描述】:
在应用程序的某处,我创建了一个 proc 的实例,它是 Process 类型,如下所示:
proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.FileName = Settings.Instance.OBSExeFile;
proc.Exited += (a, b) => doSomething();
proc.Start();
proc.WaitForInputIdle();
在Form.Closing事件上,我想关掉它,轻轻地,如果它还开着的话。
我发现没有其他方法可以使用 .NET 中的本机内容(Close() 或 Kill() 或 CloseMainWindow() 似乎都不适合我的需要)所以我决定将 WM_CLOSE 发送到应用程序并打电话给Process.WaitForExit(),像这样:
if (proc != null && !proc.HasExited) {
if(SendMessage(proc.MainWindowHandle, WM_CLOSE, 0, IntPtr.Zero) == 0)
proc.WaitForExit();
}
我的问题是:我是否错过了以任何方式混合这种危险的东西?例如,WaitForExit()hang 可以永远吗?
【问题讨论】:
-
询问您是否“遗漏了什么”过于宽泛。您可能缺少很多东西;除非您在上面的帖子中提供了整个研究工作的所有最后细节,否则无法知道您可能忽略了什么。如果你已经提供了每一个这样的细节,那么你还没有做足够的研究。
WaitForExit()可以挂吗?当然......当您将WM_CLOSE发送到其窗口时,您无法保证任何给定进程都会退出。任何合作关闭机制都将面临同样的风险;这就是为什么 Windows 为在被告知时不关闭的进程提供超时
标签: c# .net winforms process exit