簡體   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