C#.Net exe没有';重新启动电脑时不要关闭,以免机器重新启动

本文关键字:重新启动 机器 电脑 没有 exe Net | 更新日期: 2023-09-27 17:47:24

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

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

让SmartClient应用程序识别Windows中的关闭/重新启动事件并优雅地自杀,有什么想法吗?

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

C#.Net 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应用程序故意忽略关闭或退出消息?

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

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

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

您还可以考虑为每个GUI应用程序创建一个AppDomain

通常.Net应用程序会正确响应——至少这是"开箱即用"的行为。如果不是这样,可能会有很多事情发生。在对你的程序一无所知的情况下,我的最佳猜测是,你的主UI线程中有一个长时间运行的进程,它阻止了应用程序对窗口消息的响应。