SMTP发送邮件已取消

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)

在此先感谢您的帮助!杰拉德

Yuv*_*kov 5

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

做这个:

using (SmtpClient smtpClient = new SmtpClient())
{
    await smtpClient.SendAsync(msg);
}
Run Code Online (Sandbox Code Playgroud)