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 上的示例很糟糕。而且您不是第一个遇到此问题的人,请查看那里的评论:

不好的例子

在列出了 Dispose() 你的 SmtpClient 的重要原因之后,这个例子没有这样做。此外,可能在 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 回答