В прошлом я обычно добавил следующую строку в 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
для завершения.
'но теперь я понимаю, что это может быть не совсем верно, так как я использовал End прекратить before' -Если вы звоните' выполнение End' будет немедленно прекращено и не будет изящной коллекции мусора (все будет выпущено только ОС). Так что да, вам более или менее требуется называть 'Socket.Close()', если вы хотите, чтобы соединение было грамотно закрыто при использовании 'End'. ** НО, но если вы используете «Конец», есть вероятность, что вы можете прекратить выполнение _before_, после того, как удаление сокета завершено. Не рекомендуется использовать 'End' для релизов приложений, только при отладке. –
@VisualVincent Спасибо, я думаю, что я буду избегать «Конец». Кстати, почему редактирование вопроса? Это относится только к .net? – Shuri2060
Я удалил «VB» из названия, потому что это не нужно и рекомендуется, чтобы не писать ваш язык или теги там. Пометить вопрос с помощью «vb.net» достаточно, поскольку это уже указывает, какой язык вы используете. Смотрите: [** Если вопросы включают теги в названиях? **) (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) –