查看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示例是错误的吗?
答案 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();
}