6


0

私は* C#サービス*を持っています*これは*ユーザー資格情報を使って*連続して*実行されます(つまり、localsystemとしてではありません。ただし、これは変更できません)。 ほとんどの場合、サービスは問題なく実行されているように見えますが、明らかな理由もなく*爆弾を投げかけて*再起動します*(サービスマネージャはクラッシュ時にサービスを再起動するように設定されています)

私は実質的な*イベントロギング*を行っています、そして私は*例外処理*への*階層化アプローチ*を持っています。

  • 基本的に私は*トップレベル*の一般的な例外、null例外および起動時の例外ハンドラを手に入れました。

  • それから私は "* command level *"(すなわちサービスが実行する特定のアクション)でさまざまなハンドラを得ました。

  • 最後に、*クラスレベル*で処理されたいくつかの例外を処理します。

リソースが適切に解放されていないかどうかを調べていましたが、私は自分のメーリングコードを疑っています(電子メールを送信)。 * MailMessageオブジェクト*に対してDisposeを呼び出していないことに気付いたので、SendMailコードを次のように書き換えました。

*基本的な質問*は:

  • このコードはメールを送信するために使用されたすべてのリソースを適切に解放しますか?

  • * SmtpClientオブジェクト*を*破棄する*方法が見当たりません。

  • (記録用:サンプルを読みやすくするためにオブジェクト初期化子を使用していません)

    private static void SendMail(string subject, string html)
    {
        try
        {
            using ( var m = new MailMessage() )
            {
                m.From = new MailAddress("[email protected]");
                m.To.Add("[email protected]");
                m.Priority = MailPriority.Normal;
                m.IsBodyHtml = true;
                m.Subject = subject;
                m.Body = html;
                var smtp = new SmtpClient("mailhost");
                smtp.Send(m);
            }
        }
        catch (Exception ex)
        {
            throw new MyMailException("Mail error.", ex);
        }
    }

2 Answer


5


私はこの質問が.NET 4より前であることを知っていますが、バージョン4はsmptサーバーにquitを正しく送るDisposeメソッドをサポートします。 msdn referenceおよびhttps://stackoverflow.com/questions/2781103/c-how-を参照してください。 smtpclientを正しく破棄する[より新しいstackoverflowに関する質問]。


1


SmtpClientクラスには、 文書化された問題があります。 彼らはあまり高価ではないので、私はサードパーティ製のコントロールを購入することをお勧めします。 チルカットはまともなものを作ります。