Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manage a .NET app to shutdown gracefully when terminated/killed

We have a .NET console app that has many foreground threads. If we kill the process using Task Manager or issuing killjob, kill from the command line in windows, is there a way by which we can gracefully shut down the application (adding manged code within the .net console app), something like having a function being called say TodoBeforeShutdown() that disposes objects, closes any open connections, etc.

P.S. - I read the other threads and they all suggested different ways to kill the process, rather than my specific question, what is the best way we can handle a terminate process, within the .NET managed code.

Thanks in advance.

like image 948
keepsmilinyaar Avatar asked Nov 24 '10 11:11

keepsmilinyaar


2 Answers

Unfortunately, there is no event raised that you can handle whenever a process is killed.
You can think of killing a process like cutting off the power to the computer—no matter what code you have designed to run on system shutdown, if the computer doesn't shut down gracefully or properly, that code is not going to run.

When you kill a process using Task Manager, it calls the Win32 TerminateProcess function, which unconditionally forces the process (including all of its owned threads) to exit. The execution of all threads/processes is halted, and all pending I/O requests are canceled. Your program is effectively dead. The TerminateProcess function does not invoke the shutdown sequence provided by the CLR, so your managed app would not even have any idea that is was being shut down.

You suggest that you're concerned about disposing objects whenever your application's process is terminated, but there are a couple of things worth pointing out here:

  • Always strive to minimize the amount of damage that could be done. Dispose of your objects as early as possible, whenever you are finished with them. Don't wait until later. At any given time, when your program's process is terminated, you should only be keeping the bare minimum number of objects around, which will leave fewer possibilities for leaks.

  • The operating system will generally clean up and free most of these resources (i.e., handles, etc.) upon termination.

  • Finally, it should go without saying that process termination in this way is truly an exceptional condition—even if some resources leak, that's to be expected. You're not supposed to shut an app down this way any more than you're supposed to kill necessary Windows system processes (even though you can when running as an Administrator).

If this is your regular plan to shut down your console application, you need to find another plan.

like image 175
Cody Gray Avatar answered Sep 28 '22 16:09

Cody Gray


In short: You can't!
Killing a process is exactly the opposite of a gracefull exit.
If you are running Foreground Threads, sending a wm_exit won't shut down your app. Since you have a console app, you could simply redirect the console input to send an "exit" to your process.
Further I think you could change the app to service (instead of a console application), this would offer you exactly what you are looking for -> interface for gracefull exit based on windows build-in tools/commands.

like image 29
Jaster Avatar answered Sep 28 '22 15:09

Jaster