如何作为程序的最后一步异步发送邮件?

时间:2017-01-18 05:25:57

标签: c# email asynchronous sendmail

我有一个C#控制台应用程序,它的最后一步是SendMail函数。我可以异步发送此邮件,还是在邮件发送之前进程结束?由于SendMail函数是最后一步,我担心应用程序将退出而不等待异步SendMail进程完成。在此功能之前发生了几个步骤

public static void function1()
{
    //step1 
    //step2
    SendMail();
}

public static void SendMail()
{
    MailMessage mailMessage = new MailMessage();
    try
    {
        MailTemplate template = new MailTemplate();
        SmtpClient smtpClient = new SmtpClient();
        smtpClient.EnableSsl = true;
        //set SMTP host and credentials
        //set mailMessage body, from_email, to_email, message body
        smtpClient.Send(mailMessage);
    }
    catch (Exception e)
    {
        Logger.Error(e.Message + e.StackTrace);
    }
    finally
    {
        mailMessage.Dispose();
    }
}

1 个答案:

答案 0 :(得分:0)

这里有几点:首先,在您展示的代码示例中,您确定异步发送电子邮件。 SmtpClient.Send方法的documentation明确指出"此方法会在传输电子邮件时阻止。"

如果您 异步发送电子邮件,事实上,您必须采取措施防止控制台应用程序在邮件发送完成之前关闭。

话虽如此,如果发送电子邮件是程序执行的最后一件事(即当时没有其他工作要做),那么异步执行此操作无论如何都无法帮助您。我通常的比喻是在一个有10个人的餐厅点餐:如果第一个人在服务员来的时候没有准备好,他会先接受其他9个人的订单,然后再回到他身边。这基本上是异步/等待在C#中的工作方式。但是,你在这里所拥有的东西类似于一个只有一个人的餐厅;服务员实际上没有什么可做的其他而不是等待那个人准备订购,所以异步无法在这里帮助 - 服务员等待那个人随时准备订购任何一种方式。