Можно ли закрыть программу из главного конструктора? - PullRequest
3 голосов
/ 08 апреля 2009

Можете ли вы выйти из приложения до завершения конструктора и загрузки основной формы?

При запуске у меня появляется экран загрузки, который отображается перед загрузкой основной формы. Экран загрузки отображается в конструкторе до его завершения.

Я делаю нечто похожее с экраном выхода, используя переменную между главной формой и экраном выхода. У меня есть выход приложения в основной форме, если экран выхода возвращает true.

Наконец, все настройки потока / класса / загрузки / программы должны быть выполнены в главном конструкторе, или я делаю это неправильно?

Обновление:

Я имею в виду после program.cs и в статическом main

namespace app
{
 public partial class app1 : Form
 {
   public app1()
   {  
      InitializeComponent();
      // open loading screen
      // initialize vars
      // create objects
   }
 // form opens when app1() finishes
  1. Является ли app1() подходящим местом для инициализации всего?
  2. Если я попытаюсь отправить «закрыть» сообщение обратно с экрана загрузки до завершения app1(), оно не будет работать - процесс все равно будет запущен, даже если ничего не открыто.

Ответы [ 6 ]

10 голосов
/ 14 июня 2009

Я обнаружил, что если я пытаюсь убрать свое приложение из основного конструктора форм, когда у меня все еще есть заставка, показывающая в другом потоке (что похоже на то, что вы делаете), Application.Exit() не работает , но Environment.Exit(-1) делает.

5 голосов
/ 22 июля 2011

попробуйте это,


    public partial class MyForm : Form
    {        
    public MyForm()
    {
     if (MyFunc())
        {
            this.Shown += new EventHandler(MyForm_CloseOnStart);
        }
    }

    private void MyForm_CloseOnStart(object sender, EventArgs e)
    {
         this.Close();
    }
    }

это будет хорошо работать ...

0 голосов
/ 26 июля 2017

Как ответил jontsnz, код с

Environment.Exit(-1)

прекрасно работает в конструкторе, но это заставляет приложение генерировать событие «зависание приложения», которое можно рассматривать как ошибку в средстве просмотра событий Windows. С помощью

Environment.Exit(0)

Выход без регистрации ошибки, поэтому я предпочитаю это.

0 голосов
/ 08 апреля 2009

Вы можете сломать конструктор только с помощью исключения. Чтобы сделать это тайно, бросьте свое собственное исключение.

class ConstructorAbortedException : Exception { }

class Foo
{
  public Foo()
  {
    if(goesWrong)
    {
      throw new ConstructorAbortedException();
    }
  }
}

void Bar()
{
  try
  {
    Foo f = new Foo();
  }
  catch(ConstructorAbortedException)
  {
    //..
  }
}
0 голосов
/ 08 апреля 2009

Когда заканчивается основная нить:

  • фоновые темы "убиты / заброшены"
  • потоки переднего плана (по умолчанию при создании потоков) ждут, пока они не завершатся.
0 голосов
/ 08 апреля 2009

Какой главный конструктор какого класса?

Вы говорите о статическом методе Main, который имеет местоположение по умолчанию в классе Program?

Этот метод используется для инициализации, которая должна произойти перед открытием любых окон на экране.

Очевидно, что если вам нужно использовать экран загрузки, вы, вероятно, захотите переместить некоторый код в другое место, так как вам нужен цикл сообщений вокруг форм, и цикл сообщений будет блокироваться до тех пор, пока форма не закроется.

Если вы вернетесь из метода Main до того, как откроете какую-либо форму, то никакая форма не будет показана явно.

Сказав все это, я чувствую, что ваш вопрос немного расплывчатый, и я почти уверен, что не совсем понял, о чем вы спрашиваете.

Прежде всего, Main это не конструктор, это просто статический метод.

...