0

SmtpClientの MSDN ドキュメントを確認したところ、サンプル コードが次のようになっていることに気付きました。

client.SendAsync(message, userState);
// More stuff
message.Dispose();

SendAsync の呼び出しが完了するまでにかなりの時間がかかる場合があります。SendAsync呼び出しに続く行でメッセージが破棄された場合、メッセージが有用な状態のままになるのはなぜですか?

さらに、SmtpClientはIDisposableを実装しています。MSDN の例では、より多くのプロパティを次のように形成する必要があります

using (SmtpClient client = new SmtpClient())
{
    // Initialize client and create the message
    using (MailMessage message = new MailMessage(from, to))
    {
        client.SendAsync(message, userState);
        // More stuff
    }
}

したがって、client.SendAsync()がまだ実行されている可能性があるときに message.Dispose() が呼び出されるだけでなく、client.Dispose ()も呼び出されます。

SendAsync( )の呼び出しのほぼ直後にDispose()が呼び出された場合、 SendAsync()の完了のためにクライアントが有用な状態のままになるのはどうしてですか?

それとも、MSDN の例は間違っているのでしょうか?

4

2 に答える 2

1

非同期送信操作が完了またはキャンセルされた後にのみ破棄する必要があります。したがって、この状況では SendCompleted イベント ハンドラーで破棄します。

MSDN のサンプルを見てください。

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

または、このブログ投稿

http://leedumond.com/blog/new-in-net-4-dont-forget-to-dispose-your-smtpclient-instances/

MSDN の例は不適切です。そして、あなたはこの問題を抱えた最初の人ではありません:

悪い例

SmtpClient を Dispose() する重要な理由を説明した後、この例ではそうしません。また、おそらく SendAync が完了する前に MailMessage で Dispose() が呼び出されるため、例外が発生したと確信しています。ただし、SendComplete イベント ハンドラで MailMessage を破棄できます。

于 2012-07-23T15:10:37.710 に答える
0

待機イベントを使用して、これを行う方法は次のとおりです。

        // Initialize client and create the message
        using (var emailWait = new AutoResetEvent(false))
        using (var client = new SmtpClient())
        using (var message = new MailMessage(from, to))
        {
            client.SendCompleted += (sender, e) => emailWait.Set();
            client.SendAsync(message, userState);
            // More stuff
            emailWait.WaitOne();
        }
于 2012-07-23T16:22:47.043 に答える