Вызов Application.Run()
вызывает запуск нового цикла сообщений приложения в текущем потоке. Если последующий вызов Application.Run()
выполняется во время работы первого приложения, InvalidOperationException
генерируется в соответствии с документами . Однако в вашем случае это на самом деле невозможно, так как ваш вызов Application.Run()
вызывается в потоке пользовательского интерфейса, который блокирует выполнение любого следующего кода, пока он не завершится.
Вместо этого нам нужно загрузить приложение с помощью Application.Run(new Main())
, а затем внутри формы Main
мы будем обрабатывать отображение и скрытие.
Вот как я бы предложил это сделать:
Во-первых, в вашем методе Main
замените все на Application.Run(new Main());
.
Затем внутри вашей Main
формы создайте метод, подобный следующему:
private void Main_Shown(Object sender, EventArgs e)
{
Task.WaitAll(Task.Delay(500));
this.Hide();
var menuForm = new MForm();
menuForm.Closed += (obj, args) => { this.Show(); };
menuForm.Show();
}
И, наконец, перейдите в файл Main.Designer.cs
и убедитесь, что вы подписали событие Shown
на метод Main_Shown
, который вы только что создали в методе InitializeComponent
, следующим образом:
this.Shown += new System.EventHandler(this.Main_Shown);
Объяснение того, что здесь происходит:
Согласно документам событие Form.Shown
запускается при первом показе формы пользователю. Это идеально подходит для данного варианта использования, поэтому мы «подключаемся» к нему и реагируем на него, ожидая задержки в 500 миллисекунд.
После этого мы скрываем текущую (Main
) форму, создаем новую (MForm
) форму и показываем ее. Но более важная деталь заключается в том, что мы подписываемся на это событие формы Closed
, чтобы при закрытии пользователем форма Main
снова показывала себя.