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);
}

提前感谢您的帮助!杰拉德

SMTP发送邮件取消

using语句将在完成执行块时调用对象的Dispose方法。在异步方法上调用smtpClient.SendAsync而不使用await将导致执行块结束,Dispose将在SmtpClient上调用,即使SendAsync方法仍在执行,这解释了为什么一些邮件完成,因为一些邮件可能在处理对象之前完成,而另一些则没有。

这样做:

using (SmtpClient smtpClient = new SmtpClient())
{
    await smtpClient.SendAsync(msg);
}