Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET任务中发送电子邮件在控制台应用程序中不起作用_C#_.net_Multithreading_Console Application_Task - Fatal编程技术网

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

C# 在.NET任务中发送电子邮件在控制台应用程序中不起作用,c#,.net,multithreading,console-application,task,C#,.net,Multithreading,Console Application,Task,我有下面的代码。这将在我的控制台应用程序的末尾运行。我没有收到在任务中完成时发出的电子邮件,但当我评论出任务工厂方法时,它是否有效?这段代码两次都是通过断点获得他的,但异步电子邮件流从未发送过电子邮件。有什么原因吗 Task.Factory.StartNew(() => { var smtp = new SmtpClient(); try { var toEmails = mailMessage.To.ToList(); var b

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

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
有机会在后台线程中完成代码的运行之前终止

你应该:

  • 同步运行此代码,而不启动新线程(这是我推荐的方法)
  • 使用
    task显式等待任务完成。在阻止执行
    Main
    方法时等待
    ,这根本没有考虑到使用
    ThreadPool
    线程的意义(我不会这样做):

  • 编辑

    我必须补充一点,我建议您不要使用公共库中的代码,原因如下:

  • 它以前返回void,并且正在旋转一个冗余的
    线程池
    线程来执行基于IO的工作
  • 这将导致您必须在新线程上使用
    Wait
    ,您不需要这样做
  • 如果您想要使用真正的异步api(不需要使用线程来执行IO绑定工作的api),您可以使用并在其上简单地等待:

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

    我创建了任务的返回类型,它给了我等待或不等待的选项

     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();
                    }
    
    var task=\u emailService.Send(新列表{@event.ContactEmail},主题,正文,
    新名单
    {
    新附件(新MemoryStream(字节),report.FileName,“application/pdf”)
    });
    如果(任务!=null)
    {
    task.Wait();
    }
    
    我知道这是怎么回事????我尝试了这个任务。等等,它成功了,但它没有像你说的那样抓住要点。为什么你需要在后台线程中执行这个任务呢?为什么不在控制台终止之前同步运行它呢?它是web应用程序中其他地方使用的一个常见类,可以在线程中处理电子邮件,以获得更快的响应时间。我只是在重复使用它。web应用程序中的控制台应用程序?我很困惑。我将异步查看那封电子邮件,以前从未见过。
     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();
                    }