События гарантированно пройдут? - PullRequest
4 голосов
/ 20 мая 2011

Допустим, у меня есть форма SomeForm, которая наследуется от формы.

public class SomeForm : Form
{
    private void SomeForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("FormClosed event in SomeForm class");
    }
}

public class Consumer
{
    SomeForm someForm = new SomeForm();
    someForm = null; //Ideally the messagebox would display here
    SomeForm someForm = new SomeForm();
    someForm.Close();  //Messagebox would display in this case as well
}

Я хочу показать этот MessageBox всякий раз, когда форма закрыта. Должен ли я вставить это в событие FormClosed? Можно ли предположить, что событие FormClosed будет запускаться каждый раз, когда запускается что-то вроде деструктора? Есть ли лучшее место для размещения этого кода, который должен появляться при закрытии формы?

EDIT

Кто-то высказал хорошую мысль в комментариях ниже. Кажется, событие не срабатывает, когда для экземпляра класса установлено значение null. Однако будет ли вызываться деструктор или какой-либо другой метод, когда для экземпляра задано значение NULL. Я хочу гарантировать, что мой код запускается, когда пользователь заканчивает работу с классом.

Я также знаю, что принудительное выключение системы, завершение процесса, стихийные бедствия и т. Д. Не приведут к запуску моего кода, несмотря ни на что. =)

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

Да, он будет вызываться, если не произойдет что-то исключительное, например, убить его с помощью системных команд или потянуть за вилку.Другие случаи включают

  1. , устанавливающие переменную в null (без вызова метода Close)
  2. Исключение в другом делегате: все события MulticastDelegate s и делегатывыполняются в порядке появления в том MulticastDelegate, если один из предыдущих делегатов перед вашим вызовет исключение, ваш делегат не будет вызван.
1 голос
/ 20 мая 2011

Он будет вызван, если ваш исполняемый файл не будет принудительно закрыт (через диспетчер задач или taskkill из командной строки) или программа не завершится.

РЕДАКТИРОВАТЬ: я провел некоторые эксперименты иобнаружил следующее:

  • Если вы установите нулевую ссылку на форму, форма останется видимой, а когда форма закроется, событие будет инициировано.
  • Если ваша формаявляется дочерней формой, а основная форма закрывается, дочерняя форма закрывается БЕЗ инициируемого события.
  • Если вы вызываете метод Hide() формы, событие НЕ вызывается.Последующее закрытие основной формы, как упоминалось выше, не приведет к возникновению события.
  • Переопределение OnClosed() не поможет, поскольку оно все равно не вызывается, если основная форма закрыта.
  • Вызов метода Dispose() формы (что в конечном итоге будет делать сборщик мусора, если ничто не указывает на него), также не приведет к возникновению события.

Похоже, что на самом деле нетспособ ГАРАНТИРОВАТЬ код будет вызываться из формы.Вы можете поместить код после Application.Run(); в ваш Main(), и он будет вызываться там.Также существует событие для Application.ApplicationExit, которое будет вызываться, если у вас нет исключительных обстоятельств (принудительное закрытие или сбой).

Вы можете зарегистрировать обработчик для события Application.ApplicationExit в своей форме, но помните, чтона этот раз ваш объект уже был уничтожен, поэтому вы ничего не можете с ним сделать.

0 голосов
/ 20 мая 2011

Событие FormClosed вызывается методом OnClosed. Поэтому, если вы хотите получить определенный уровень гарантии, вы можете переопределить метод OnClosed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...