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

C# 如何作为程序的最后一步异步发送邮件?,c#,email,asynchronous,sendmail,C#,Email,Asynchronous,Sendmail,我有一个C#控制台应用程序,它的最后一步是SendMail功能。我可以异步发送此邮件,还是在发送邮件之前进程结束?由于SendMail函数是最后一步,我担心应用程序将在不等待异步SendMail进程完成的情况下退出。在此函数i之前,有几个步骤 public static void function1() { //step1 //step2 SendMail(); } public static void SendMail() { MailMessage mai

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

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

这里有几点:首先,在您展示的代码示例中,您肯定没有异步发送电子邮件。
SmtpClient.Send
方法的说明清楚地表明“此方法在发送电子邮件时阻塞。”

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


话虽如此,如果发送电子邮件是程序做的最后一件事(即,它当时没有其他工作要做),那么异步发送电子邮件无论如何也不会真正帮助您。我通常的比喻是在一家有10个人的餐厅点菜:如果第一个人在服务员过来时还没有准备好,他会先接受其他9个人的点菜,然后再回到他身边。这就是async/await在C#中的工作原理。然而,这里的情况类似于一家只有一个人的餐厅;侍者除了等待伙计准备好点菜之外无事可做,因此asynchronous在这里根本帮不上忙-侍者一直在等待伙计准备好点菜。

您应该显示代码,例如
void async sendmail…
以及在控制台应用程序事件生命周期中调用它的位置。没有这些信息很难帮助你。请阅读关于编写更好的问题的其他提示。您意识到您所展示的实际上并不是异步的,对吗?如果你正在做一些异步的事情,你能展示这一部分吗?(现在所写的问题在技术上应因不可复制而关闭)。