Это поведение модальных форм. Когда вы используете form.ShowDialog()
, вы запрашиваете такого поведения. Причина этого в том, что form.ShowDialog не возвращается, пока форма не будет скрыта или уничтожена. Поэтому, когда форма скрыта, насос внутри формы. ShowDialog уничтожает ее, чтобы она могла вернуться.
Если вы хотите показать и скрыть форму, вам следует использовать немодальную диалоговую модель
http://msdn.microsoft.com/en-us/library/39wcs2dh(VS.80).aspx
form.Show()
немедленно возвращается, вы можете показать и скрыть это окно, сколько хотите, и оно не будет уничтожено, пока вы явно не уничтожите его.
Когда вы используете немодальные формы, которые не являются потомками модальной формы, вам также необходимо запустить насос сообщений, используя Application.Run
или Application.DoEvents
в цикле. Если поток, создающий форму, завершается, форма будет уничтожена. Если этот поток не запускает насос, то формы, которыми он владеет, не будут отвечать.
Изменить: это звучит как то, что ApplicationContext
предназначен для решения. http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx
По сути, вы наследуете класс от ApplicationContext, передаете экземпляр вашего ApplicationContext в качестве аргумента Application.Run()
// Create the MyApplicationContext, that derives from ApplicationContext,
// that manages when the application should exit.
MyApplicationContext context = new MyApplicationContext();
// Run the application with the specific context.
Application.Run(context);
Контекст вашего приложения должен знать, когда можно выйти из приложения, а когда скрытые формы не должны выходить из приложения. Когда пришло время для выхода из приложения. Ваш контекст приложения или форма могут вызвать метод ExitThread()
контекста приложения, чтобы завершить цикл обработки сообщений. В этот момент Application.Run()
вернется.
Не зная больше об иерархии ваших форм и ваших правилах принятия решения, когда скрывать формы и когда выходить, невозможно быть более конкретным.