2012-07-03 3 views
4

오류 처리를 담당하는 클래스가 있습니다. 소멸자가 호출되면 프로세스를 실행하려고합니다. 그러나 슬프게도 프로세스가 시작되지 않습니다. 새로운 프로세스는 exe를 호출하여 전자 메일을 보내야합니다. 왜 이것이 작동하지 않습니까?소멸자에서 새 프로세스 실행

~ErrorH() 
{ 
    if ((int)e > 0) 
     SendErrorMail(); 
} 

private void SendErrorMail() 
{ 
    if (File.Exists("C:\\Program Files (x86)\\MailSend\\MailSend.exe")) 
    { 
     ProcessStartInfo mailsend = new ProcessStartInfo(); 
     mailsend.FileName = "C:\\Program Files (x86)\\MailSend\\MailSend.exe"; 
     mailsend.Arguments = "…"; 
     Process.Start(mailsend); 
    } 
} 

예를 들어 생성자에서 SendErrorMail 함수를 실행하면 모든 것이 잘 동작합니다. 디버거를 보면 Process.Start(mailsend); 명령에 도달 한 것처럼 보입니다. 무엇이 잘못 되었나요? 어떻게 해결할 수 있을까요?

편집

좋아, 지금은 IDisposable 방법을 사용했다. 그것은 잘 작동하지만 올바르게 사용합니까? 프로그램에서

class ErrorH : IDisposable 
{ 
private bool disposed = false; 
... 
public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected virtual void Dispose(bool desposing) 
{ 
    if(!this.disposed) 
     if ((int)e > 0) 
      SendErrorMail(); 
    disposed = true; 
} 

내가 사용

using (Parameter p = new Parameter(args[0])) 
{ 
... 
} 

Parameter에서 클래스 ErrorH 상속.

Greetz

+0

소멸자에'mbox'를 표시하려고 했습니까 ?? GC에 의해 아직 호출되지 않았을 수도 있습니다. –

+0

소멸자는 객체가 가비지 수집 될 때 호출되어야합니다. 따라서 프로그램 수명주기 동안 발생하는 것을 보장 할 수 없습니까? –

+0

아니요, 실제로 테스트 해 보았습니다. MessageBox가 나타납니다. – hofmeister

답변

2

보다는 인터페이스 System.IDisposable를 사용하여 현재 시간에 호출되도록 보장 할 수 없습니다 소멸자를 사용.

일반적으로 C#에서 소멸자를 사용하는 것은 나쁜 습관입니다. 가비지 수집기 (GC)로 개체가 파괴 될 특정 시간을 결정할 수 없기 때문에 C#은 Dispose이라는 단일 메서드를 제공하며 객체 사용을 끝내면 명시 적으로 호출하거나 using 블록으로 암시 적으로 호출 할 수 있습니다.

+0

감사합니다. greate는 작동하지만 올바르게 사용합니까? 제발 ** 편집 **을 참조하십시오. 인사말 – hofmeister