This topic has not yet been rated - Rate this topic

Application.Exit Event

Occurs just before an application shuts down, and cannot be canceled.

Namespace:  System.Windows
Assembly:  PresentationFramework (in PresentationFramework.dll)
XMLNS for XAML: http://schemas.microsoft.com/winfx/2006/xaml/presentation, http://schemas.microsoft.com/netfx/2007/xaml/presentation
public event ExitEventHandler Exit
<object Exit="ExitEventHandler" .../>

An application can shut down for either of the following reasons:

  • The Shutdown method of the Application object is called, either explicitly or as determined by the ShutdownMode property.

  • The user ends the session by logging off or shutting down.

You can detect when application shutdown occurs by handling the Exit event, and perform any additional processing as required.

You can also handle Exit to inspect or change the application exit code when you don't need to call Shutdown explicitly. The exit code is exposed from the ApplicationExitCode property of the ExitEventArgs argument that's passed to the Exit event handler. When the application stops running, the exit code is passed to the operating system for subsequent processing.

If your application handles the SessionEnding event and subsequently cancels it, Exit is not raised and the application continues running in accordance with the shutdown mode.

The exit code can be set from an XAML browser application (XBAP), although the value is ignored.

For XBAPs, Exit is raised in the following circumstances:

  • An XBAP is navigated away from.

  • In Internet Explorer 7, when the tab that is hosting the XBAP is closed.

  • When the browser is closed.

In all cases, the value of the ApplicationExitCode property is ignored.

The following example demonstrates how to:

  • Handle the Exit event.

  • Inspect and update the ApplicationExitCode property of the ExitEventArgs.

  • Write an entry to an application log in isolated storage.

  • Persist the application state to isolated storage.


<Application x:Class="CSharp.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  StartupUri="MainWindow.xaml" 
  ShutdownMode="OnExplicitShutdown"
  Exit="App_Exit"
    >
</Application>



using System;
using System.Collections;
using System.Windows;
using System.IO;
using System.IO.IsolatedStorage;

namespace CSharp
{
    public enum ApplicationExitCode
    {
        Success = 0,
        Failure = 1,
        CantWriteToApplicationLog = 2,
        CantPersistApplicationState = 3
    }

    public partial class App : Application
    {
        void App_Exit(object sender, ExitEventArgs e)
        {
            try
            {
                // Write entry to application log
                if (e.ApplicationExitCode == (int)ApplicationExitCode.Success)
                {
                    WriteApplicationLogEntry("Failure", e.ApplicationExitCode);
                }
                else
                {
                    WriteApplicationLogEntry("Success", e.ApplicationExitCode);
                }
            }
            catch
            {
                // Update exit code to reflect failure to write to application log
                e.ApplicationExitCode = (int)ApplicationExitCode.CantWriteToApplicationLog;
            }

            // Persist application state
            try
            {
                PersistApplicationState();
            }
            catch
            {
                // Update exit code to reflect failure to persist application state
                e.ApplicationExitCode = (int)ApplicationExitCode.CantPersistApplicationState;
            }
        }

        void WriteApplicationLogEntry(string message, int exitCode)
        {
            // Write log entry to file in isolated storage for the user
            IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly();
            using (Stream stream = new IsolatedStorageFileStream("log.txt", FileMode.Append, FileAccess.Write, store))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                string entry = string.Format("{0}: {1} - {2}", message, exitCode, DateTime.Now);
                writer.WriteLine(entry);
            }
        }

        void PersistApplicationState()
        {
            // Persist application state to file in isolated storage for the user
            IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly();
            using (Stream stream = new IsolatedStorageFileStream("state.txt", FileMode.Create, store))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                foreach (DictionaryEntry entry in this.Properties)
                {
                    writer.WriteLine(entry.Value);
                }
            }
        }
    }
}


.NET Framework

Supported in: 4, 3.5, 3.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
Shutdown event not called
I'm not sure about other versions of Windows, but Windows 7 x64 is definately not even calling the application.shutdown event if the user ends the session via Log Off, Shutdown, or Restart.  A situation like this completely defies the entire purpose of the existence of the event to begin with.  Documentation recommends handling this event  to ensure your application shuts down as you need it to (indicating it will always be called).  Unfortuantely that is not the case and Application.Shutdown event is unreliable as you can't be sure it will even be called at all.
Event is NOT called on system shutdown
Quote from http://msdn.microsoft.com/en-us/library/ms743714.aspx
"When an application shuts down, it may need to perform some final processing, such as persisting application state. For these situations, you can handle the Exit event."

Quote from this article:
"An application can shut down for either of the following reasons: [..] The user ends the session by logging off or shutting down. [..] You can detect when application shutdown occurs by handling the Exit event, and perform any additional processing as required. "

But this is not true, this event is not being called on system shutdown, at least when using Windows 7/x64