2012-07-17 4 views
6

내 클래스 중 하나가 응용 프로그램 실행 중 통계를 수집하고 응용 프로그램이 완료되면이 통계를 디스크에 저장하려고합니다. 내가 볼 것으로 예상 로그를 볼 수 없습니다 그러나응용 프로그램 종료시 정보를 파일에 저장하는 올바른 방법

~Strategy() 
    { 
     foreach(var item in statisticItems) 
     { 
      log.WriteLine(item.Text); // log is AutoFlush 
     } 
    } 

또한 내가 할 수있는 디버거 순간에하지 "캐치"소멸자 : 그 같은 파일에 저장하는 로그에 노력했다, 그래서 나는 내 프로그램 내부에이 클래스를 파괴하지 라는.

질문 : 소멸자가 호출 될 때

  • 왜 디버거에서 나는이 순간을 잡을 수없는 이유는 무엇입니까? 프로그램이 끝나면 모든 객체에 대해 소멸자를 호출해야합니까?
  • 내 물건을 기록하려면 어떻게해야합니까?
+0

언제든지 중지 버튼을 사용하여 디버거를 종료 하시겠습니까? – Blindy

+0

@Blindy 아니오 방금 창을 닫습니다. – javapowered

+0

'전략 '이 인스턴스화 되었습니까? 정적 클래스입니까? 아니면 정적 메서드 만 사용하고 있습니까? 가능한 한 더 많은 정보, 사용 사례를 제공하십시오. 문제의 프레임 워크에서 버그를 할인 할 수 있습니다. 이는 코드에있는 것이므로 여기서만 추측 할 수 있습니다. – Blindy

답변

1

소멸자 (또는 종료 자)는 그와 같은 코드를 삽입 할 수있는 장소가 아니다. 관리되지 않는 리소스를 해제하기 위해 설계되었습니다. 소멸자는 비 결정적으로 호출되므로 소멸자 내에서 유효한 모든 객체에 의존 할 수 없습니다. 그리고 아주 특별한 상황에서 별도의 스레드에서 호출되기 때문에 디버거에서이를 catch 할 수 없습니다. 간단히 말해, 필요하지 않다면 소멸자를 사용하지 마십시오.

응용 프로그램 종료를 기록하는 이상적인 방법은 Main 메서드 끝에 로깅 코드를 두는 것입니다. throw 된 모든 예외를 catch하고 로깅하는지 확인해야하며,이 경우 Main 끝에 종료를 기록 할 수 있습니다.

스택 오버플로와 같은 오류로 인해 종료를 로그 할 수없는 몇 가지 중요한 경우가 있습니다.이 경우 오류가 발생하기 전의 로그를 사용해야합니다.

+0

좋은 조언을하는 동안이 누구도 실제 질문에 대답하지 않습니다 ... – Blindy

+0

"내 물건을 기록하려면 무엇을 사용해야합니까?" –

+0

이제 다른 질문도 해결됩니다. –

-1

소멸자에 의존하지 마십시오. 다음과 같이 사용하는 것이 좋습니다.

[STAThread] 
static void Main() 
{ 
    using(new Strategy()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

public class Strategy : IDisposable 
{ 
    public void Dispose() 
    { 
     WriteLogs() 
    } 
    ... 
} 

이렇게하면 로그가 기록됩니다.

정적 void Main은 Windows Forms 응용 프로그램을 만들 때 만들어지는 기본 program.cs에서 복사됩니다.

+0

-1을 참조하십시오. 이걸로 망쳐 놓지 말고 진짜 거래를하십시오. – Blindy

+0

COM afaik에 속한 'STAThread' 속성을 사용하는 이유는 무엇입니까? 왜 내가 소멸자에 의지해서는 안되니? – javapowered

+0

'Disposable'은 소멸자에 대한 최적화입니다. (적절한 패턴은 소멸자를 포함합니다.) 주된 이점은 필요에 따라 리소스를 해제 할 수 있다는 것입니다. – Blindy

-1

이 안 전체 않음 (아직) 이지만,이 체크 아웃 :

프로그래머이 상기 가비지 컬렉터에 의해 결정되기 때문에, 소멸자 라고시기를 조절할 수 없다. 가비지 수집기가 응용 프로그램에서 더 이상 사용하지 않는 개체를 확인합니다. 파괴 대상 객체를 고려하면 은 소멸자 (있는 경우)를 호출하고 객체를 저장하는 데 사용 된 메모리를 회수합니다. 소멸자는 프로그램이 종료 될 때도 호출됩니다.

출처 : MSDN은 콘솔 응용 프로그램의 경우

, 당신은 무슨 일보고 Environment.Exit(0);를 호출하려고 수 있을까?

흥미로운 질문이므로이 답변을 계속 업데이트 해주세요. 누구든지 자유롭게 편집 할 수 있습니다.

감사

+0

위키 스타일의 답변을 원한다면 커뮤니티 위키 답변이 필요합니다. –

+0

@KendallFrey 편집하고 싶지 않다면, 그렇게하지 않아도됩니다. 여전히 OP에 대한 질문을했으며 답변을 개선하기 위해 피드백을 기다리고 있습니다. "너는 틀렸어, 이렇게해야 해"라고 말하는 것보다 낫다. –

+0

의견은 OP의 질문을 할 수있는 곳이다. 답변은 답변입니다. –

관련 문제