我们有一个内置在C#中的SmartClient,当正在重启的PC运行时,它仍然保持打开状态。这将暂停重新启动过程,除非用户首先关闭SmartClient或进行其他一些手动干预。

当基础架构团队远程安装需要重新启动计算机的新软件时,这会导致问题。

让SmartClient应用程序从Windows识别关闭/重启事件并优雅地自杀的任何想法?

<强>更新 这是一个具有多个gui线程的高度线程化应用程序。是的,多个gui线程。它实际上是许多项目的整合,它们本身可以是独立的应用程序 - 所有这些都是从单个exe启动和管理的,这些exe集中了这些管理方法并跟踪这些线程。我不相信使用后台线程是一种选择。

有帮助吗?

解决方案

好的,如果您有权访问该应用,则可以处理SessionEnded事件。

...
Microsoft.Win32.SystemEvents.SessionEnded +=new
  Microsoft.Win32.SessionEndedEventHandler(shutdownHandler);

...

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
  // Do stuff
}

其他提示

它必须是一个继续运行的线程,阻止您的应用程序关闭。如果您使用线程,则可以将其设置为背景。

  

线程是后台线程或前台线程。后台线程与前台线程相同,除了后台线程不会阻止进程终止。一旦属于进程的所有前台线程终止,公共语言运行库就结束该进程。任何剩余的后台线程都会停止并且不会完成。

     

http://msdn.microsoft.com /en-us/library/system.threading.thread.isbackground.aspx

当用户注销或Windows正在关闭时, WM_QUERYENDSESSION 消息将发送到所有顶级窗口。请参阅 MSDN文档。

响应此消息的WinForm应用程序的默认行为是使用 CloseReason == WindowsShutDown 或其他来触发 FormClosing 事件。事件处理程序虽然可以选择顽固并拒绝关闭应用程序,从而保持系统运行。

检查应用程序的 FormClosing 处理程序。也许那里有东西。我已经见过几次这样的东西了。

或许.Net应用程序有意忽略关闭或退出消息?

后台线程是一个快速而肮脏的解决方案,最好的解决方案是使用同步对象( ManualResetEvent Mutex 或其他东西)来阻止其他线程;

或者跟踪所有打开的窗口,并在主应用关闭时发送 WM_CLOSE 消息。

您必须提供有关如何启动这些GUI应用程序的更多信息。也许你为每个应用程序启动一个线程并调用 Application.Run(new Form1());

您还可以考虑为每个GUI应用程序

创建 AppDomain

通常.Net应用程序会正确响应 - 至少,这是“开箱即用”的行为。如果不是,可能会有很多事情发生。在不了解您的程序的情况下,我最好的猜测是,您在主UI线程中有一个长时间运行的进程阻止应用程序响应窗口消息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top