【问题标题】:How to send mail asynchronously as the last step in a program?如何在程序的最后一步异步发送邮件?
【发布时间】:2017-01-18 05:25:56
【问题描述】:

我有一个 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();
    }
}

【问题讨论】:

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

标签: c# email asynchronous sendmail


【解决方案1】:

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

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

话虽如此,如果发送电子邮件是程序所做的最后一件事(即它当时没有其他工作要做),那么异步执行此操作无论如何都不会真正帮助您。我通常的比喻是在一家有 10 个人的餐厅点菜:如果服务员经过时第一个人还没准备好,他会先接其他 9 个人的订单,然后再回来找他。这基本上就是 async/await 在 C# 中的工作方式。但是,您在这里的情况类似于只有一个人在其中的餐厅;服务员除了等待那个人准备好点菜之外,实际上无事可做方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多