6

ユーザーの資格情報を使用して継続的に実行されるC#サービスがあります(つまり、ローカルシステムとしてではありません-変更したいのですが、これを変更することはできません)。ほとんどの場合、サービスは正常に実行されているように見えますが、明確な理由もなく爆破して再起動することがよくあります(サービサーマネージャーはクラッシュ時にサービスを再起動するように設定されています)。

私は実質的なイベントロギングを行っており、例外処理への階層化されたアプローチがあり、少なくともある種の意味があると信じています。

  • 基本的に、最上位の汎用例外、null例外、および起動例外ハンドラーを取得しました。
  • 次に、「コマンドレベル」(つまり、サービスが実行する特定のアクション)でさまざまなハンドラーを取得しました。
  • 最後に、クラスレベルで処理されるいくつかの例外を処理します

リソースが適切にリリースされていないかどうかを調べていましたが、自分のメールコード(メールの送信)が疑われ始めています。MailMessageオブジェクトに対してDisposeを呼び出していないことに気付き、次のようにSendMailコードを書き直しました。

基本的な質問は次のとおりです。

  • このコードは、メールの送信に使用されるすべてのリソースを適切に解放しますか?
  • SmtpClientオブジェクトを破棄する方法がわかりませんか?
  • (記録のために:私はサンプルを読みやすくするためにオブジェクト初期化子を使用していません)
    private static void SendMail(string subject, string html)
    {
        try
        {
            using ( var m = new MailMessage() )
            {
                m.From = new MailAddress("service@company.com");
                m.To.Add("user@company.com");
                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);
        }
    }
4

2 に答える 2

5

この質問は.Net4より前のものですが、バージョン4は、SMTPサーバーに終了を適切に送信するDisposeメソッドをサポートするようになりました。msdnリファレンス新しいstackoverflowの質問を参照してください。

于 2010-10-15T00:36:51.350 に答える
1

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

于 2009-07-14T22:29:39.607 に答える