SmtpClient によって使用されるリソースを適切に破棄する
-
13-09-2019 - |
質問
私は持っています C# サービス それ 継続的に実行される ユーザー資格情報を使用します(つまり、ローカルシステムとしてではありません - 変更したいのですが、変更できません)。ほとんどの場合、サービスは正常に実行されているように見えますが、時々爆発してしまうことがあります。 明らかな理由もなく再起動する (サービサーマネージャーはクラッシュ時にサービスを再起動するように設定されています)。
充実したことをやっている イベントロギング, 、そして私は 多層的なアプローチ に 例外処理 それは少なくともある種の意味があると私は信じています:
- 本質的に私が得たのは、 トップレベル 汎用例外、null 例外、および起動例外ハンドラー。
- 次に、「」でさまざまなハンドラーを取得しました。コマンドレベル" (つまり、サービスが実行する特定のアクション)
- 最後に、次で処理されるいくつかの例外を処理します。 クラスレベル
適切にリリースされていないリソースがないか調べているのですが、自分のメール コード (電子メールの送信) が疑われ始めています。Dispose を呼び出していないことに気づきました。 MailMessage オブジェクト, で、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である知っているが、バージョン4が正しくSMPTサーバに終了を送信Disposeメソッドをサポートしています。 MSDN参照を参照してください< href = "https://stackoverflow.com/questions/2781103/c-how-to-correctly-dispose-of-an-smtpclient">新しいstackoverflowの質問でます。
他のヒント
SmtpClientクラスと文書化の問題のがあります。彼らはあまりにも高価ではありませんので、私は、サードパーティ製のコントロールを購入をお勧めします。チルカットはまともなものを作るています。