Closing all forms in an application seems like it would be a simple task of using a foreach loop in the Application.OpenForms collection, such as:

foreach (Form form in Application.OpenForms)
{
    form.Close();
}

But there are two problems.

First, the code above will throw an exception because the OpenForms collection changes each time you close a form, and so the enumerator in your foreach loop becomes invalid when you close a form.  Instead, you need to get an array of all open forms, then loop through the array:

static public void CloseAllForms()
{
    // get array because collection changes as we close forms
    Form[] forms = OpenForms; 

    // close every open form
    foreach (Form form in forms)
    {
        CloseForm( form );
    }
}

Second, it’s quite possible that your application opened one or more forms in a separate thread.  If so, then trying to close a form from your main thread will throw an exception.  So you need to close your forms in a thread-safe manner:

delegate void CloseMethod( Form form );
static private void CloseForm( Form form )
{
    if (!form.IsDisposed)
    {
        if (form.InvokeRequired)
        {
            CloseMethod method = new CloseMethod( CloseForm );
            form.Invoke( method, new object[] { form }  );
        }
        else
        {
            form.Close();
        }
    }
}

Download a C# WinForms project that demonstrates how to close all Forms in a C# application in a thread-safe manner.

Share and Enjoy:
  • Digg
  • Twitter
  • Facebook
  • Reddit
  • StumbleUpon
  • LinkedIn
  • Google Bookmarks
  • Slashdot