SMTP发送邮件取消
本文关键字:取消 SMTP | 更新日期: 2023-09-27 18:13:13
尝试发送邮件,但任务被取消。知道为什么吗?
public static Task SendAsync(this SmtpClient client, MailMessage message)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
Guid sendGuid = Guid.NewGuid();
SendCompletedEventHandler handler = null;
handler = (o, ea) =>
{
if (ea.UserState is Guid && ((Guid)ea.UserState) == sendGuid)
{
client.SendCompleted -= handler;
if (ea.Cancelled)
{
tcs.SetCanceled(); // TASK CANCELLED: Why?
}
else if (ea.Error != null)
{
tcs.SetException(ea.Error);
}
else
{
tcs.SetResult(null);
}
}
};
client.SendCompleted += handler;
client.SendAsync(message, sendGuid);
return tcs.Task;
}
调用:
using( SmtpClient smtpClient = new SmtpClient() )
{
return smtpClient.SendAsync(msg);
}
提前感谢您的帮助!杰拉德
using
语句将在完成执行块时调用对象的Dispose
方法。在异步方法上调用smtpClient.SendAsync
而不使用await
将导致执行块结束,Dispose
将在SmtpClient
上调用,即使SendAsync
方法仍在执行,这解释了为什么一些邮件完成,因为一些邮件可能在处理对象之前完成,而另一些则没有。
这样做:
using (SmtpClient smtpClient = new SmtpClient())
{
await smtpClient.SendAsync(msg);
}