2016-08-16 6 views
2

나는 보통 내 응용 프로그램을 종료하기 위해 KeyDown 하위에 다음 줄을 추가했습니다 리소스를 해제하는 측면에서 응용 프로그램을 끝내는 가장 최악의 방법 중 하나입니다.응용 프로그램을 올바르게 종료하는 방법은 무엇입니까? 실제로 않습니다 <code>End</code>, 그것은 아마 것으로 밝혀 무엇에 설명서를 읽으면,</p> <pre><code>If e.KeyCode = Keys.Escape Then End </code></pre> <p>그러나 : 과거

이제는 모든 리소스를 적절히 처리 할 수있는 응용 프로그램을 종료하는 데 권장되는 방법을 찾으려고합니다. SO에 대한 두 가지 질문 (herehere)은 결론을 내릴 수 없습니다. e 옳은 대답은 실제로 무엇입니까.

first link에 대한 대답은 모든 양식에 Close()을 적용하는 것이 올바른 방법이며 올바른 사용 리소스를 모두 해제한다고 말합니다. 이것은 여러 형태의 애플리케이션에서 편리하지 않습니다, 그리고 Application.Exit()이 제안 내려 또한, 심지어 : 확실히 할 것

Application.Exit() 
End 

확신 프로그램은 첫 번째 줄에 실패하는 경우에도 끝납니다. 한편

second link에 허용 대답은 위의 모든 형태에 Application.Exit() 전화 Close()를 말한다 더 아래 답변을 모순 " 당신이 적절하게 설계된 응용 프로그램Application.Exit()를 호출하지 않아도한다"라고 .Net의 이후 버전에서.

이로 인해 혼란스러워졌습니다. Application.Exit()의 문제점은 무엇입니까?

Application.Exit() 
End 

하거나 무리이다 : 그것은 아무 문제가없는 경우

, 그때에 가서 바로 최고의 한 생각에 나는 무엇입니까? 그렇지 않은 경우 Application.Exit()은 언제 작동합니까? (취소하는 코드를 작성할 때를 제외하고)?

참고 :이 질문은 여러 가지 양식이있는 프로그램을 포함하여 내가 작성한 모든 프로그램에 적용되지만 최근에 컴퓨터 간 연결을 위해 소켓을 사용하기 시작했으며이를 종료 할 때 추가 정보를 알려 주셨습니다. 연결의 중간에있는 프로그램. 나의 recent question에있는 코멘트는 Socket.Close() 호출이 심지어 필요하지 않다는 것을 나에게 확신시킨다. 그러나 지금 나는 End을 사용하기 때문에 이것이 완전히 사실이 아닐 수도 있다는 것을 깨닫는다.

+3

'하지만 지금은 당신이 End' 실행이 즉시 종료됩니다 '전화 - 만약 before'을 종료 종료를 사용하여 이후이 완전히 진실하지 않을 수 있음을 깨닫고 거기에 우아한 쓰레기 수거 (OS에 의해 모든 것이 공개 될 것입니다)가 없을 것입니다. 그래서 네,'End'를 사용할 때 연결을 정상적으로 닫으려면'Socket.Close()'를 호출해야합니다. **하지만 ** End를 사용하면 소켓 처분이 완료되기 전에 실행을 종료 할 수도 있습니다. 디버깅 할 때만 어플리케이션 릴리즈에'End'를 사용하지 않는 것이 좋습니다. –

+0

@VisualVincent 감사합니다. 그럼 '끝'을 피할 것입니다. 왜 질문을 편집 btw? 이것은 .net에만 적용됩니다. – Shuri2060

+1

제목에서 "VB"를 제거 했으므로 불필요하며 거기에 언어 나 태그를 쓰지 않는 것이 좋습니다. 'vb.net'으로 질문에 태그를 지정하면 이미 사용하는 언어가 표시되기 때문에 충분합니다. 참조 : [** 질문에 제목에 태그를 포함해야합니까? **] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) –

답변

2

Application.Exit은 해당 응용 프로그램의 모든 메시지 루프에 대한 종료 메시지를 게시합니다.

이것은 응용 프로그램을 닫을 수있는 완벽한 방법이며 모든 양식이 종료되도록합니다. 예를 들어 작업을 저장하지 않은 경우와 같이 개별 양식이이 동작을 무시할 수 있습니다. 이렇게하면 응용 프로그램이 계속 실행되므로 처리해야하는지 결정해야합니다.

외부 액터가 내 애플리케이션을 종료해야하는 경우에만 사용한다고 말하고 있습니다. 그렇지 않으면 기본 양식이 닫힐 때 앱이 종료됩니다.

포 그라운드 스레드의 상태를 고려해야합니다. 모든 양식을 닫고 스레드 처리를 백그라운드에서 처리 할 수 ​​있기 때문입니다.

끝은 매우 강력한 기술이며 마지막으로 사용되어야합니다. 잘 디자인 된 응용 프로그램은 양식을 닫거나 application.exit을 호출하여 종료 할 수 있어야합니다. 나는 Application.Exit을 호출하기 직전에 End를 호출 할 타이머를 시작하는 접근법을 사용했다 ... 적어도 나는 정상적으로 완료 할 수있는 기회를 준다.

참고 : 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