Question

We have a SmartClient built in C# that stubornly remains open when the PC its running on is being restarted. This halts the restart process unless the user first closes the SmartClient or there is some other manual intervention.

This is causing problems when the infrastructure team remotely installs new software that requires a machine reboot.

Any ideas for getting the SmartClient app to recognize the shutdown/restart event from Windows and gracefully kill itself?

UPDATE: This is a highly threaded application with multiple gui threads. yes, multiple gui threads. Its really a consolidation of many project that in and of themselves could be standalone applications - all of which are launched and managed from a single exe that centralizes those management methods and keeps track of those threads. I don't believe using background threads is an option.

Was it helpful?

Solution

OK, if you have access to the app, you can handle the SessionEnded event.

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

...

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

OTHER TIPS

It must be a thread that continues to run preventing your application to close. If you are using threading an easy fix would be to set it to background.

A thread is either a background thread or a foreground thread. Background threads are identical to foreground threads, except that background threads do not prevent a process from terminating. Once all foreground threads belonging to a process have terminated, the common language runtime ends the process. Any remaining background threads are stopped and do not complete.

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

When a user is logging off or Windows is being shut down, WM_QUERYENDSESSION message is sent to all top-level windows. See MSDN documentation here.

The default behavior of a WinForm application in response to this message is to trigger the FormClosing event with CloseReason == WindowsShutDown or others. The event handler though can choose to be stubborn and refuse to shut the app down, thus keeping the system running.

Check FormClosing handlers of your applications. Maybe there is something in there. I've seen this kind of stuff a couple of times.

Or maybe the .Net app is ignoring close or quit messages on purpose?

Background threads was a quick and dirty solution, best solution is to use synchronization objects (ManualResetEvent, Mutex or something else) to stop the other threads;

Or else keep track of all your opened windows and sent WM_CLOSE message when main app closes.

You have to give more information about how do you start those GUI applications. maybe you start one thread for each application and call Application.Run(new Form1()); ?

You may also look into creating a AppDomain for each GUI Application

Normally a .Net app would respond correctly- at least, that's the 'out of the box' behavior. If it's not, there could be a number of things going on. My best guess without knowing anything more about your program is that you have a long-running process going in the main UI thread that's preventing the app from responding to window messages.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top