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
线程的意义(我不会这样做):
线程池线程来执行基于IO的工作
Wait
,您不需要这样做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();
}