异步和等待时出错 - 不会向用户发送邮件

时间:2017-05-17 16:35:00

标签: c# email asynchronous

这就是几天前我可以向客户发送电子邮件的方式。但是现在,它出现了这个错误。

  

此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =“true”%>。此异常还可能表示尝试调用“异步void”方法,该方法通常在ASP.NET请求处理中不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。

我通过向客户发送邮件来完成此操作。我也看过其他错误的人。

public static async void NewPassword(string mail, string name, string password)
    {
        MailDefinition oMailDefinition = new MailDefinition();
        oMailDefinition.BodyFileName = "~/img/emailskabelon/NewPassword.html";
        oMailDefinition.From = OrdklarMail;

        Dictionary<string, string> oReplacements = new Dictionary<string, string>();
        oReplacements.Add("<<navn>>", name);
        oReplacements.Add("<<password>>", password);

        MailMessage oMailMessage = oMailDefinition.CreateMailMessage(mail, oReplacements, new LiteralControl());
        oMailMessage.Subject = Password;
        oMailMessage.IsBodyHtml = true;

        SmtpClient smtp = new SmtpClient(AzureApi);
        NetworkCredential netcred = new NetworkCredential(AzureName, AzurePassword);
        smtp.UseDefaultCredentials = false;
        smtp.EnableSsl = true;

        smtp.Credentials = netcred;
        smtp.Port = Port25;
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

        using (var smtpClient = new SmtpClient())
        {
            await Task.Delay(1500);
            await Task.Factory.StartNew(() => oMailMessage);
            await smtpClient.SendMailAsync(oMailMessage);
        }

        //smtp.Send(oMailMessage);
    }

有什么问题,因为它不会向客户发送电子邮件? - 这是我的问题。

2 个答案:

答案 0 :(得分:1)

您的代码存在许多不同的问题,从async void返回类型开始,不支持ASP.NET (您的异常告诉您)。

此外,您正在创建SmtpClient的两个不同实例,并使用错误的实例发送电子邮件。

另外,为什么你甚至等待两个完全没用的任务?

这是一个固定版本:

public static async Task NewPassword(string mail, string name, string password)
{
    MailDefinition oMailDefinition = new MailDefinition();
    oMailDefinition.BodyFileName = "~/img/emailskabelon/NewPassword.html";
    oMailDefinition.From = OrdklarMail;

    Dictionary<string, string> oReplacements = new Dictionary<string, string>();
    oReplacements.Add("<<navn>>", name);
    oReplacements.Add("<<password>>", password);

    MailMessage oMailMessage = oMailDefinition.CreateMailMessage(mail, oReplacements, new LiteralControl());
    oMailMessage.Subject = Password;
    oMailMessage.IsBodyHtml = true;

    using(SmtpClient smtp = new SmtpClient(AzureApi))
    {
        NetworkCredential netcred = new NetworkCredential(AzureName, AzurePassword);
        smtp.UseDefaultCredentials = false;
        smtp.EnableSsl = true;

        smtp.Credentials = netcred;
        smtp.Port = Port25;
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

        await smtp.SendMailAsync(oMailMessage);
    }
}

另请注意,您需要将页面声明为:

<%@ Page Async="true" %>

使用页面中的await调用此方法。

答案 1 :(得分:0)

另一个问题可能是你忘记使用等待代码的某个地方。我的意思是,如果您刚刚开始执行任务并继续执行页面。一旦提供页面请求,ASP.NET就可以将此线程标记为已完成,并且GarbageCollector可以在之后的任何时间将其销毁。这将导致您的任务将消失。这个时间不是一成不变的,所以有时你的后台任务可能会完成而有些时候不会。