1. ホーム
  2. c#

[解決済み] .NET 4.0でのSmtpClient、SendAsync、Disposeの使用に関するベストプラクティスを教えてください。

2022-08-14 05:52:58

質問

SmtpClient が使い捨てになったので、特に SendAsync を使用して呼び出しを行う場合、SmtpClient をどのように管理するかについて少し困惑しています。 おそらく、SendAsync が完了するまで Dispose を呼び出さないようにすべきです。 しかし、私はそれを呼び出す必要があります(例えば、"using"を使用します)。 シナリオは、呼び出しが行われたときに定期的に電子メールを送信するWCFサービスです。 ほとんどの計算は高速ですが、電子メールの送信には1秒ほどかかることがあるため、Asyncが望ましいと思います。

メールを送信するたびに新しい SmtpClient を作成する必要がありますか。 WCF全体に対して1つ作成する必要がありますか? 助けてください!

更新する 因みに、各メールは常にユーザーに合わせてカスタマイズされています。 WCFはAzureでホストされ、メーラーとしてGmailが使用されています。

どのように解決するのですか?

注意: .NET 4.5 SmtpClient は、以下のものを実装しています。 async awaitable メソッド SendMailAsync . 下位バージョンでは SendAsync を使います。


を常に破棄する必要があります。 IDisposable インスタンスはできるだけ早く破棄する必要があります。非同期呼び出しの場合、これはメッセージが送信された後のコールバックで行われます。

var message = new MailMessage("from", "to", "subject", "body"))
var client = new SmtpClient("host");
client.SendCompleted += (s, e) => {
                           client.Dispose();
                           message.Dispose();
                        };
client.SendAsync(message, null);

はちょっと困る。 SendAsync がコールバックを受け付けないのはちょっと困る。