5

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

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

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

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

4

6 回答 6

5

它必须是一个继续运行的线程,以防止您的应用程序关闭。如果您使用线程,一个简单的解决方法是将其设置为背景。

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

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

于 2008-10-03T18:55:19.270 回答
5

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

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

...

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
  // Do stuff
}
于 2008-10-03T18:58:27.873 回答
5

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

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

检查FormClosing您的应用程序的处理程序。也许里面有什么东西。这种东西我见过几次。

于 2008-10-03T19:27:11.593 回答
1

或者,.Net 应用程序可能故意忽略关闭或退出消息?

于 2008-10-03T18:52:41.520 回答
1

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

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

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

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

于 2008-10-03T19:09:07.167 回答
0

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

于 2008-10-03T18:49:00.373 回答