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]))
{
...
}

からのクラスErrorH継承Parameter

グリーツ

4

1 に答える 1

2

現時点で呼び出されることが保証されていないデストラクタを使用する代わりに、 interface を使用しますSystem.IDisposable

通常、たとえば C++ のように C# でデストラクタを使用することは悪い習慣です。オブジェクトがガベージ コレクター (GC) によって破棄される特定の時間を判断できないため、C# では、オブジェクトの使用が終了したときに明示的に呼び出すか、ブロックによって暗黙的に呼び出すことができるIDisposable単一のメソッドを提供します。Disposeusing

于 2012-07-03T07:44:38.433 に答える