2016-08-16 2 views
2

В прошлом я обычно добавил следующую строку в KeyDown подразделов, чтобы закончить мои приложения:Как правильно закрыть приложение?

If e.KeyCode = Keys.Escape Then End 

Однако при чтении документации о том, что на самом деле делает End, то получается, что это, вероятно, один из худших способов прекратить применение с точки зрения освобождения ресурсов и т. д.

Итак, теперь я пытаюсь найти рекомендуемый способ прекратить приложение, которое будет правильно обрабатывать все ресурсы и т. д. Я нашел эти два вопроса по SO (here и here), но я не могу кончить каков правильный ответ.

В принятом ответе на first link говорится, что применение Close() ко всем формам является правильным способом и позволит освободить все используемые ресурсы правильно. Это не удобно в приложениях с несколькими формами, и далее вниз Application.Exit() предлагается, и даже:

Application.Exit() 
End 

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

С другой стороны, принятый ответ на second link говорит «вы никогда не должны вызывать Application.Exit() в правильно спроектированной применения», что противоречит выше, и ответ далее вниз, который говорит Application.Exit() звонки Close() на всех формах в более поздних версиях .Net.

Это привело меня к путанице - что не так с Application.Exit()?

Если нет никаких проблем с ним, то я прав, считая лучшим вариантом пойти с является:

Application.Exit() 
End 

или что перестарались? В противном случае, когда Application.Exit() не работает (кроме случаев, когда я пишу код, который отменяет его)?

Примечание: Хотя этот вопрос относится ко всем программам, которые я делаю, в том числе с несколькими формами, я недавно начал использовать сокеты (с TcpClient/Listener классов), чтобы соединения между компьютерами и был бы признателен за любую дополнительную информацию, относящуюся к этому при завершении программа в середине соединения. Комментарий в моем recent question заверяет меня, что вызов Socket.Close() даже не нужен, но теперь я понимаю, что это может быть не совсем верно, поскольку я использовал End для завершения.

+3

'но теперь я понимаю, что это может быть не совсем верно, так как я использовал End прекратить before' -Если вы звоните' выполнение End' будет немедленно прекращено и не будет изящной коллекции мусора (все будет выпущено только ОС). Так что да, вам более или менее требуется называть 'Socket.Close()', если вы хотите, чтобы соединение было грамотно закрыто при использовании 'End'. ** НО, но если вы используете «Конец», есть вероятность, что вы можете прекратить выполнение _before_, после того, как удаление сокета завершено. Не рекомендуется использовать 'End' для релизов приложений, только при отладке. –

+0

@VisualVincent Спасибо, я думаю, что я буду избегать «Конец». Кстати, почему редактирование вопроса? Это относится только к .net? – Shuri2060

+1

Я удалил «VB» из названия, потому что это не нужно и рекомендуется, чтобы не писать ваш язык или теги там. Пометить вопрос с помощью «vb.net» достаточно, поскольку это уже указывает, какой язык вы используете. Смотрите: [** Если вопросы включают теги в названиях? **) (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) –

ответ

2

Application.Exit отправляет сообщение выхода ко всем циклам сообщений для этого приложения.

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

Говоря, что я использую его только в том случае, если внешнему актеру необходимо закрыть приложение. В противном случае я оставляю приложение для выхода, когда его основная форма закрывается.

Вам также необходимо рассмотреть состояние любых потоков переднего плана, которые у вас есть, поскольку они могут закрыть все ваши формы, но оставить обработку потока в фоновом режиме.

Конец - очень грубая техника и ее следует использовать в качестве последнего ресота. Хорошо спроектированное приложение должно иметь возможность завершить работу, закрыв формы или вызвав application.exit. В прошлом я использовал подход, запускающий таймер, который будет вызывать End перед тем, как я вызову Application.Exit ... по крайней мере, я даю ему возможность законно закончить.

Примечание: Application.Exit не блокируется. Таким образом, Application.Exit : End также может быть End который не идеален.

Вот таймер я использую:

Dim forceExitTimer = New Threading.Timer(Sub() End, Nothing, 2500, Timeout.Infinite) 
    Application.Exit() 
+0

Спасибо! Я только что попробовал поиск безрезультатно: '' Application.Exit() 'никогда не завершает работу приложения, если вы не пишете какой-либо код, который явно останавливает это? – Shuri2060

+0

Да. Форма может блокировать его в событии FormClosing. Темы могут также оставаться открытыми, если вы их не завершаете. Это, в основном, сигнал к приложению, чтобы закончить изящество, разработчик должен сделать это, но это не так сложно. См. Мою заметку о таймере выхода для чего-то, что обеспечит его окончательное завершение. – FloatingKiwi

+0

Спасибо, я буду использовать метод таймера выхода тогда (я думал, что он блокировал). – Shuri2060