【问题标题】:Closing an application gently and waiting for it exit轻轻关闭应用程序并等待它退出
【发布时间】: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


【解决方案1】:

根据您提供的信息,我认为好的方法是创建 Windows 服务而不是 .exe。然后,您将完全控制过程。

在 windows 服务中,您可以创建一个代码,当stop 命令将发送给它时“温和地”关闭当前服务。

【讨论】:

    【解决方案2】:

    向它发送一条消息,然后让它自行关闭(以您认为合适的任何方式)。我有一组程序可以做到这一点,为此我使用 udp 广播到 127.0.0.1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多