2009-03-04 7 views
19

사용자가 내 응용 프로그램을 종료 할 때, 그때 나는 내가 다음을 수행 내가 (즉 ... 서버에서 분리 사용자 데이터를 저장)을 가지고 있고 몇 가지 작업을 수행합니다Process.GetCurrentProcess()를 사용하면 안되는 이유는 무엇입니까? WinForm 응용 프로그램을 종료하려면 Kill()을 사용 하시겠습니까? 지금

  • booleans를 사용하여 모든 메인 루프를 종료하십시오.
  • 여전히 실행중인 스레드 (일반적으로 내 서버 폴링 스레드)를 중단하십시오.
  • Application.Exit(); ,

이 종료 몇 초를 소요되며, 실제 목적을 제공하지 않습니다 (모든 것이 이미 서버에 저장되기 때문에, 난 정말이 무슨 상관 없어) 내가 대신를 사용하는 경우

I

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

왜 난 그냥 내 프로세스를 종료하고 CLR이 응용 프로그램 도메인을 삭제하지 것입니다 : 내가 생각할 수없는 단점으로 즉시 종료있어?

공유 리소스 (IO 파일 처리기 등)를주의해서 폐기하는 것이 중요하므로 (답변하지 마십시오 :) :) 일단 완료되면 내 앱을 완전히 종료해야 할 실질적인 이유가 있습니까?

+1

이 경우 최종 블록이 처리되지 않아 다른 누군가가 코드를 유지 보수 할 때 예기치 않은 버그가 발생할 수 있습니다. –

+0

@Hosam : 좋은 지적입니다. upvoted 수 있도록 응답으로 게시하지 않는 이유는 무엇입니까? – Brann

+0

@Brann : 완료. 제안 해 주셔서 감사합니다. –

답변

4

우선, Process.Kill()이 아닌 Process.TerminateProcess()을 의미한다고 생각합니다. 둘째, 프로세스를 종료하면 문제가 해결됩니다. 정리 코드가 실행되지 않고 응용 프로그램이 kill을 취소 할 기회를 얻지 못합니다 (예 : 사용자가 저장하지 않은 데이터가있는 경우). 네가 행복하다면, 그걸로 가라.

+1

사실 Process.GetCurrentProcess()입니다. Kill(); 그에 따라 내 게시물을 수정했습니다. 그것을 알아 줘서 고마워! :) – Brann

4

참으로 좋은 질문입니다!

이전에 (10 년 이상 전에) 웹 서버에 사용 된 특정 인증서로 인해 WinINet OCX (또는 그것이 호출 된 것이 무엇이든)의 확인 된 버그로 인해 해지가 중단 된 VB6 응용 프로그램을 작성했습니다 얘기하고 있었다.

이 버그를 해결할 방법이 없으면 TerminateProcess를 사용했고 몇 년 동안 수천 대의 컴퓨터에서이 응용 프로그램을 사용하고 있었고이 해킹에 관한 어떤 문제도 들어 본 적이 없습니다.

+0

그리고 아직 나는 킬 테스트에서 실패한 테스트 케이스를 가지고있다. 그것은 주사위를 굴려서, 정확하게 과정이 죽었을 때, 정확하게 과정이 무엇을하고 있었는지 정확히 일어날 것입니다. 이것이 ACID 데이터베이스가 데이터 쓰기/재사용을 보장하기 위해 엄청난 길이 *를 거친 이유입니다. 따라서 언제든지 데이터를 잃어 버리지 않고 무의미하게 종료 할 수 있습니다. 붙어있는 프로세스가 중요한 데이터 (그 이후의 데이터)로 모든 스쿼트 작업을 수행했다면, 꼭 그 데이터를 누크하십시오. 프로세스 탐색기를 통해 프로세스를 종료하는 것만 큼 차이는 없습니다. – user2864740

1

파일/네트워크 스트림에 쓰는 경우 작성이 불완전 할 수 있습니다.

응용 프로그램이 이런 방식으로 손상된 데이터를 처리 할 준비가되면 그럴 필요가 없습니다. 그러나 다른 방법으로 퇴장 할 수 있다면 추천 할 것입니다.

12

프로세스를 죽이는 것은 최종적으로 블록이 실행되지 않으며 실제로는 중요 할 수도있는 critical finalizer objects조차도 아니며 시스템 수준에서 리소스가 누출 될 수 있음을 의미합니다. 또한 다른 사람이 코드를 유지 보수 할 때 예기치 않은 버그가 발생할 수 있습니다. 코드가 실행될 것인지 여부를 finally 블록으로 작성할 때마다 생각해야합니다.

+0

프로세스가 종료 되었기 때문에 OS가 리소스를 유출하지 않아야합니다. 그러나 마침내 블록과 파이널 라이저는 좋은 지적입니다. – Qwertie

+1

@Qwertie 예, 그렇지만 때때로 그렇습니다. 예를 들어 응용 프로그램이 충돌하더라도 카메라가 열린 채로 남아있을 수 있습니다. 그것은 운전사의 버그 일 수 있지만 그것은 또한 "시스템"의 일부입니다. –

0

System.Environment.Exit(int)을 사용하지 않으시겠습니까? 코드를 저장하기 위해이 작업을 수행하려는 것 같습니다. 나에게 Exit에 대한 호출이 훨씬 더 명확 해지고 종료가 더 잘 제어되고 Finalizers와 Critical Finalizers가 실행됩니다.

+0

Environment.Exit (int)는 내부 appdomain 또는 기본 코드가 WER/ReportFault 패밀리로 점프하는 경우 종료를 보장하지 않습니다. 커널 수준의 교착 상태로 인해 프로세스가 종료되지 않으므로 Kill()도 종료 보증이 아니지만 종료는 프로그램이 정리를 허용하는 동안 즉시 종료됩니다. –

1

finalizers may actually be never executed 따라서 프로세스를 죽이는 것은 느린 종결 자나 예외를 던지는 최종 자처럼 종결 코드를 건너 뛰는 다른 이유와 크게 다르지 않습니다.

전반적으로 응용 프로그램을 닫을 때 걱정하지 않아도됩니다. 특히 모든 창을 즉시 숨기고 사용자에게 "사라집니다". 그러나 닫는 데 수십 초가 걸리거나 사용자가 응용 프로그램을 다시 실행하고 다중 인스턴스를 지원하지 않으면 Process.Kill을 호출하는 것이 좋습니다.

나는 종료 나이을 일부 응용 프로그램을 알고, 난, 그냥 잔인하게, 사용자 나 자신을 죽이는 것이 아니라 만드는 일일를 볼 수 있도록 노력하겠습니다 (이 OS를 다시 시작에 특히 짜증나) 그것을 할.

1

오류 또는 누출을 잡을 방법이없는 제 3 자 라이브러리를 사용하여 충돌을 MessageBox를 발생시키지 않고 종료하는 유일한 방법은 프로세스를 강제 종료하는 것입니다.

관련 문제