繁体   English   中英

在.NET Task中发送电子邮件在控制台应用程序中不起作用

[英]Sending email within .NET Task not working in console application

我下面有以下代码。 它在控制台应用程序的末尾运行。 在任务中完成任务后,我没有收到发送出去的电子邮件,但是当我注释掉任务工厂方法时,它行得通吗? 代码两次都带有断点,但是异步电子邮件流从未发送过电子邮件。 有什么原因吗?

Task.Factory.StartNew(() =>
{ 
    var smtp = new SmtpClient();
    try
    {
        var toEmails = mailMessage.To.ToList();
        var bccEmails = mailMessage.Bcc.ToList();

        foreach (var email in toEmails)
        {
           mailMessage.To.Clear();
           mailMessage.To.Add(email);
           mailMessage.Bcc.Clear();

           smtp.Send(mailMessage);
        }
     }
     catch (Exception ex)
     {
       Logger.Error(ex);
     }
});

正如您所说的“这在控制台应用程序的末尾运行” ,我假设您的Main方法在Task.Factory.Startnew有机会在后台线程中完成运行之前终止。

您应该:

  1. 同步运行此代码,而无需启动新线程(这是我推荐的方法)
  2. 明确等待任务使用Task.Wait完成,同时阻止执行Main方法,这Task.Wait错过了使用ThreadPool线程的意义(我不会这样做):

     Task.Factory.StartNew(() => { var smtp = new SmtpClient(); try { var toEmails = mailMessage.To.ToList(); var bccEmails = mailMessage.Bcc.ToList(); foreach (var email in toEmails) { mailMessage.To.Clear(); mailMessage.To.Add(email); mailMessage.Bcc.Clear(); smtp.Send(mailMessage); } } catch (Exception ex) { Logger.Error(ex); } }).Wait(); 

编辑

我不得不补充一点,出于以下几个原因,我建议您不要使用公共库中的代码:

  1. 它先前返回了void,并且正在旋转一个多余的ThreadPool线程来执行基于IO的工作
  2. 这将导致您不得不在新线程上使用Wait ,而您不需要它。

如果您想使用一个真正的异步api(不需要使用线程来执行IO绑定工作),则可以使用SmtpClient.SendMailAsync并简单地await它:

var smtp = new SmtpClient();
try
{
    var toEmails = mailMessage.To.ToList();
    var bccEmails = mailMessage.Bcc.ToList();

    var taskMails = toEmails.Select(email => 
    {
        var message = new MailMessage
        {
            To = email
        };

        smtp.SendMailAsync(message);
    };

    await Task.WhenAll(taskEmails);
 }
 catch (Exception ex)
 {
   Logger.Error(ex);
 }

我选择了Task的返回类型,这使我可以选择是否等待。

 var task = _emailService.Send(new List<string> { @event.ContactEmail }, subject, body,
                    new List<Attachment>
                        {
                            new Attachment(new MemoryStream(bytes), report.FileName, "application/pdf")
                        });

                if (task != null)
                {
                    task.Wait();
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM