Завершение приложения.
От: ynblpb  
Дата: 10.11.04 16:09
Оценка: :)
Забавная ситуация имеется:

Создается С# проект в VS.NET 2003. Windows Application.
В нем присутствуют:
Форма, кнопка.

Обработчик кнопки такой: (Вариант 1)
private void button1_Click(object sender, System.EventArgs e)
{
    Application.Exit();
}

При нажатии на кнопу приложение нормально завершается.

Если в обработчике написать строку this.Close(); приложение тоже завершится.
Но вот в чем вопрос.

Если обработчик имеет вид: (Вариант 2)
private void button1_Click(object sender, System.EventArgs e)
{
    Application.Exit();
        MessageBox.Show("test");
}

Не закрывается форма. Если добавляем this.Close() первой строкой — форма закрывается,
но процесс в памяти живет.

Если обработчик имеет вид: (Вариант 3)
private void button1_Click(object sender, System.EventArgs e)
{
    this.Close();
        return;
        MessageBox.Show("test");
}

Форма закрывается и приложение тоже завершается.

При таком виде обработчика: (Вариант 4)
private void button1_Click(object sender, System.EventArgs e)
{
    Application.Exit();
        return;
        MessageBox.Show("test");
}

Все завершается тоже.
(Вариант 5)
private void button1_Click(object sender, System.EventArgs e)
{
        this.Close();
    Application.Exit();
        return;
        MessageBox.Show("test");
}

Такой вариант тоже работает.

Какой из последних трех вариантов более корректен? (подозреваю последний)
и почему при отсутствии return не происходит завершение программы. (Вариант 2)


12.11.04 12:56: Перенесено модератором из '.NET' — AndrewVK
можть и я вам когда-нибудь помогу
Завершение приложения.
От: Аноним  
Дата: 10.11.04 16:57
Оценка:
Одного не понимаю. Еще когда я программил на c++, я думал, что после return заканчивает выполнение функции. Какой смысл после return чего-то вызывать:
...
return;
MessageBox.Show("test"); //данная строка не будет вызываться
...



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Завершение приложения.
От: GarryIV  
Дата: 10.11.04 17:08
Оценка:
Hello, ynblpb!

y> Забавная ситуация имеется:


Поставь ReSharper он тебе тонко намекнет, что после return код не выполняется никогда. Соответсвенно наличие\отсутствие там мессаджебокса ни на что не влияет.

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 gamma
WBR, Igor Evgrafov
Re[2]: Завершение приложения.
От: ynblpb  
Дата: 11.11.04 09:35
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Hello, ynblpb!


y>> Забавная ситуация имеется:


GIV>Поставь ReSharper он тебе тонко намекнет, что после return код не выполняется никогда. Соответсвенно наличие\отсутствие там мессаджебокса ни на что не влияет.


GIV>WBR, Igor Evgrafov.


Либо я не корректно поставил вопрос либо пост не внимательно был прочитан.

Я прекрасно знаю что после return не выполняется код.
Непонятно почему если в обработчике есть одна инструкция return приложение
не завершается. И непонятно то почему при непосредственном вызове Application.Exit()
с стоящими после этого вызова инструкциями (в частности MessageBox.Show())
приложение тоже не завершается.
Хотя

Application.Exit Method

This method stops all running message loops on all threads and closes all windows of the application. This method does not force the application to exit. The Exit method is typically called from within a message loop, and forces Run to return. To exit a message loop for the current thread only, call ExitThread.

CAUTION The Form.Closed and Form.Closing events are not raised when the Application.Exit method is called to exit your application. If you have validation code in either of these events that must be executed, you should call the Form.Close method for each open form individually before calling the Exit method.

Иными словами непонятен механизм ни Application.Exit() ни Application.ExitThread()
т.к.
this.Close();
Application.ExitThread();
MessageBox.Show("bla");

такой код тоже не завершает работу приложения.

ЗЫ: MessageBox.Show("bla") в приведенных мной примерах смысловой нагрузки не несет. Нужно лишь
в качестве подопытной инструкции, которая нужна для эксперемента.
можть и я вам когда-нибудь помогу
Re[3]: Завершение приложения.
От: ynblpb  
Дата: 11.11.04 09:37
Оценка:
Здравствуйте, ynblpb, Вы писали:

Y>Здравствуйте, GarryIV, Вы писали:


Y>Непонятно почему если в обработчике есть одна инструкция return приложение

Y>не завершается.

Точнее это то понятно. Т.к. мы вроде как не покидаем MessageLoop.
можть и я вам когда-нибудь помогу
Re[3]: Завершение приложения.
От: GarryIV  
Дата: 11.11.04 11:25
Оценка:
Hello, ynblpb!

y>>> Забавная ситуация имеется:


GIV>> Поставь ReSharper он тебе тонко намекнет, что после return код не

GIV>> выполняется никогда. Соответсвенно наличие\отсутствие там
GIV>> мессаджебокса ни на что не влияет.

y> Либо я не корректно поставил вопрос либо пост не внимательно был

y> прочитан.

Еще раз перечитал вопрос... Склоняюсь к первому варианту

y> Я прекрасно знаю что после return не выполняется код.

И какой смысл тогда в писать Messagebox.Show() после него?

y> Непонятно почему если в обработчике есть одна инструкция return

y> приложение не завершается.

??? В твоих вариантах 3-5 есть return и по твоим же словам приложение завершается.

y> И непонятно то почему при непосредственном вызове Application.Exit() с

y> стоящими после этого вызова инструкциями (в частности MessageBox.Show())
y> с стоящими после этого вызова инструкциями (в частности
y> MessageBox.Show()) приложение тоже не завершается.

Хочу заметить что не любыми инструкциями. А именно Messagebox.Show(). ИМХО причины в том, что он производит манипуляции с message loop приложения. И это что-то не дает выйти из него.

y> ЗЫ: MessageBox.Show("bla") в приведенных мной примерах смысловой

y> нагрузки не несет. Нужно лишь в качестве подопытной инструкции, которая
y> нужна для эксперемента.

Как раз эта строчка является причиной происходящего... Количество return'ов ни на что не влияет.

А вообще, если тебе интересно, берешь Reflector и пытаешься выяснить что же такое делаем Messagebox.Show() что не дает процессу завершиться после вызова Exit().

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 gamma
WBR, Igor Evgrafov
Re[4]: Завершение приложения.
От: ynblpb  
Дата: 11.11.04 17:07
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>А вообще, если тебе интересно, берешь Reflector и пытаешься выяснить что же такое делаем Messagebox.Show() что не дает процессу завершиться после вызова Exit().


Будем копать рефлектор
можть и я вам когда-нибудь помогу
Re[3]: Завершение приложения.
От: SelfCoder  
Дата: 11.11.04 21:10
Оценка:
Здравствуйте, ynblpb.

Насколько я понимаю, Application.Exit(), Application.ExitThread(), this.Close() посылают сообщение окнну, что нужно закрыть, выйти и т.д. Но это сообщение ложится в очередь и не выполнится, по крайней мере, пока не закончится выполнение текущей функции. Действительно, как было сказано, MessageBox.Show() не дает правильно обработать это сообщение (выхода), а return выбрасывает из функции до выполнения MessageBox.Show() и все завершается "как по маслу".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.