gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:04:44 26 4
gpt4 key购买 nike

我在下面有以下代码。这在我的控制台应用程序结束时运行。我没有收到在任务中完成时发出的电子邮件,但是当我注释掉它有效的任务工厂方法时?该代码两次都使用断点,但异步电子邮件流从未发送过电子邮件。有什么理由吗?

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 方法,这错过了使用 的要点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();

编辑

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

  1. 它之前返回 void 并正在旋转一个冗余的 ThreadPool 线程来执行基于 IO 的工作
  2. 这将导致您必须在新线程上使用Wait,您不需要那个。

如果你想使用真正的异步 api(不需要使用线程来执行 IO 绑定(bind)工作)你可以使用 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);
}

关于c# - 在 .NET 任务中发送电子邮件在控制台应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24970792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com