What's the difference between Application.Run() and Form.ShowDialog()?
c#, winforms
Solution
`Application.Run(Form)` starts a message loop on the current thread and displays the specified form. The message loop enables the form to receive Windows messages (eg, key presses, mouse clicks, paint invalidations) to allow it to appear responsive and have interaction with the user. When you call `ShowDialog()` on a `Form` instance, it actually does a similar thing and creates a modal message loop for the form on which `ShowDialog` has been called.
There is not much difference between the two calls. `Application.Run` does add some extra event handling enabling you to do some tidying up of resources when the main form is closed (see Application.ThreadExit).
The recommended way to start WinForms applications is using `Application.Run`, but I suspect this is more of a convention than a rule. The biggest reason to use `Application.Run` is if you want to open multiple non-modal forms. You can do this using:
new Form().Show();
new Form().Show();
Application.Run();
You could not achieve this using the `ShowDialog()` method as one of the forms would have to be modal.
As for your question of how to show a login form and then the main form if the login is successful, I think what you have is fine:
if (new LoginForm().ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
The alternative is to do the plumbing yourself and open an instance of `MainForm` in the closing event of the `LoginForm` if the login was successful.
Problem
In my application I want to show a login form first and then the main form if the login has been successful. Currently I'm doing it something like this: ``` var A = new LoginForm(); if ( A.ShowDialog() == DialogResult.OK ) Application.Run(new MainForm()); ``` But then I started wondering - what's the point of the `Application.Run()`? Why not just do `(new MainForm()).ShowDialog()` as well? What's the difference? And what would be the correct way to achieve what I want?