2008-10-03 24 views
5

保持机器我们有一个建立在C#中的SmartClient正在重新启动其上运行的电脑时stubornly保持打开状态。这会暂停重新启动过程,除非用户首先关闭SmartClient或进行其他手动干预。C#.NET的exe不会关闭,无法重新启动

这是造成问题时,基础架构团队远程安装需要一台机器重新启动新的软件。

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

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

+0

你在非后台线程上运行的东西? – Will 2008-10-03 18:52:01

+0

您是否有权访问SmartClient应用程序的源代码? – 2008-10-03 19:17:14

回答

5

OK,如果你有应用程序的访问,您可以处理SessionEnded事件。

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

... 

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

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

+0

不是长时间运行的进程,但确实有上面提到的用于Catalin的Threading。尽管如此,这并不能真正回答这个问题 - 我真的正在寻找一种方法来检测机器何时重新启动。 – ScottCher 2008-10-03 19:03:58

1

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

+0

这是一个评论imo – Konstantinos 2009-04-07 12:29:18

5

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

线程可以是一个背景线程或前台线程。后台线程与前台线程完全相同,只是后台线程不会阻止进程终止。一旦属于某个进程的所有前台线程都终止,公共语言运行库就结束该进程。任何剩余的后台线程都会停止并且无法完成。

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

+0

的确,这是一个线程应用程序。查看原始帖子的更新。然而,鉴于我们正在对线程做什么,是否将它们背景化仍然可行?即,多个GUI线程。 – ScottCher 2008-10-03 19:00:33

1

后台线程是一个快速和肮脏的解决方案,最好的解决方法是使用同步对象(ManualResetEventMutex或别的东西),以阻止其他线程;

否则保持跟踪你所有打开的窗口和发送WM_CLOSE消息时,主应用程序关闭。

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

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

5

当用户注销或正在关闭Windows创建AppDomainWM_QUERYENDSESSION消息被发送到所有顶级窗口。见MSDN documentation here.

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

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