Редактировать: Этот вопрос, похоже, касается Dispose.
Во-первых, Dispose не имеет ничего общего с сборкой мусора. Происходит следующее:
- У вас есть глобальный экземпляр Timer
- Вы создаете форму2
- Form2 подписывается на таймер
- Форма 2 закрыта и / или утилизирована
- Событие Timer срабатывает, увеличивает счетчик и показывает MessageBox
- Событие Timer продолжается до тех пор, пока приложение не закроется.
Главное, что нужно понять, это то, что Close / Dispose изменяют только статус формы, они не могут (не могут) удалить экземпляр. Таким образом, (закрытая) форма есть, поле счетчика все еще там, и Событие запускается.
ОК, часть 1:
Блок using () {}
был бы лучше, но это должно работать:
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.ShowDialog();
/// I've tried Dispose() method . but didn't work
form.Dispose(); // should work
}
Если нет, опишите «не работает».
private void Form2_Load(object sender, EventArgs e)
{
Program.timer.Tick += timer_Tick;
Close();
/// I've tried Dispose() method instead of Close() . but didn't work
}
Это странно, но я предполагаю, что это искусственный код для вопроса.
Ваш глобальный Program.Timer теперь хранит ссылку на ваш экземпляр Form2 и удерживает ее от сбора. Это не мешает его утилизации / закрытию, поэтому ваш таймер будет запускать закрытую форму, что обычно приводит к сбою и другим проблемам.
- Не делайте этого (дайте Form2 свой таймер)
- Используйте событие FormClosed для отмены подписки:
Program.timer.Tick -= timer_Tick;