Ger*_*ard 2 c# email smtp async-await
尝试发送邮件,但任务已取消.知道为什么吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
被称为:
using( SmtpClient smtpClient = new SmtpClient() )
{
return smtpClient.SendAsync(msg);
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!杰拉德
一个using语句将调用对象Dispose完成执行块时的方法.smtpClient.SendAsync不使用await异步方法调用将导致执行块结束Dispose并将被调用SmtpClient,即使该SendAsync方法仍在执行,这也解释了为什么有些邮件在处理对象之前可能完成,而其他邮件则没有.
做这个:
using (SmtpClient smtpClient = new SmtpClient())
{
await smtpClient.SendAsync(msg);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |