IDisposable和异步处理(SmtpClient.SendAsync)

时间:2012-07-23 15:00:32

标签: .net asynchronous smtpclient

查看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()也会被调用。

客户端如何在完成 SendAsync()后仍然处于有用状态,如果 Dispose()几乎立即被调用调用 SendAsync()

或者,MSDN示例是错误的吗?

2 个答案:

答案 0 :(得分: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上的示例很糟糕。而且你不是第一个遇到这个问题的人看看那里的评论:

  

错误示例

     

在布置重要原因后,Dispose()你的   SmtpClient,这个例子不这样做。此外,调用Dispose()   可能在SendAync完成之前的MailMessage,我很喜欢   肯定给我带来了例外。您可以处置MailMessage   但是在SendComplete事件处理程序中。

答案 1 :(得分: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();
        }