.net IDisposable和异步处理(SmtpClient.SendAsync)

.net IDisposable和异步处理(SmtpClient.SendAsync),.net,asynchronous,smtpclient,.net,Asynchronous,Smtpclient,查看的MSDN文档中,我注意到示例代码如下所示: client.SendAsync(message, userState); // More stuff message.Dispose(); 对SendAsync的调用可能需要很长时间才能完成。如果消息在SendAsync调用后的行上被释放,它如何保持有用状态 此外,SmtpClient实现IDisposable。MSDN示例的更多属性的格式应如下所示 using (SmtpClient client = new 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示例是错误的吗?

您应该仅在异步发送操作完成或取消后处理它。 因此,在这种情况下,在SendCompleted事件处理程序中处理它

查看MSDN中的示例:

或者这篇博文

MSDN上的示例不好。你不是第一个遇到这个问题的人看看这里的评论:

坏榜样

在列出处理()的重要原因之后 SmtpClient,此示例不这样做。此外,在上调用Dispose() 可能在SendAync完成之前发送邮件,我很高兴 当然也给我带来了例外。您可以处理邮件消息 但是,在SendComplete事件处理程序中


下面是我将如何使用等待事件执行此操作:

        // 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();
        }