.net IDisposable和异步处理(SmtpClient.SendAsync)
查看的MSDN文档中,我注意到示例代码如下所示:.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()) {
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();
}