【问题标题】:Send SMTP email getting forcibly closed in console application before it can send email in .NET发送 SMTP 电子邮件在控制台应用程序中被强制关闭,然后才能在 .NET 中发送电子邮件
【发布时间】:2018-10-17 19:25:57
【问题描述】:

我有一个发送电子邮件的电子邮件通知应用程序,我们在每 5 分钟运行一次的控制台应用程序中执行此操作。我们在任务中运行电子邮件部分,以便它可以继续处理另一组通知。

但是,我们运行一个通知,控制台关闭并且电子邮件永远不会发送。在 SMTP 方面,它说主机被强制关闭。如何在所有任务完成之前保持控制台应用程序处于活动状态,但仍然能够多线程。

读取操作失败。传输的字节数:0 远程 IP: 44.444.444.44,会话:124992,代码:10054,消息:现有连接被远程主机强行关闭

private Task SendFromServer(MailMessage mailMessage, bool reuse, bool useServerSmtp)
{
    return Task.Factory.StartNew(() =>
                {
                    var smtp = new SmtpClient();
                    smtp.Send(mailMessage);
                }
                catch (Exception ex)
                {
                    Logger.Error(ex.InnerException ?? ex);
                }
                finally
                {
                    if(!reuse)
                        mailMessage.Dispose();
                }
            });
        }
}

【问题讨论】:

标签: c# .net multithreading task-parallel-library console-application


【解决方案1】:

使用SmtpClient.SendMailAsync,可以等待。

private async Task SendFromServer(MailMessage mailMessage) {
    using (var smtp = new SmtpClient()) {
        try {
            await smtp.SendMailAsync(mailMessage);
        } catch (Exception ex) {
            Logger.Error(ex.InnerException ?? ex);
        }
    }
}

并且由于它是在控制台应用程序中调用的,因此您需要像这样调用它

//get all notification tasks. Assuming notifications => List<MailMessage>
var tasks = notifications.Select(message => SendFromServer(message));
//execute all asynchronously
Task.WhenAll(tasks).GetAwaiter().GetResult();

所以控制台应用程序会等待所有的人完成他们的任务

【讨论】:

  • 似乎要等到邮件发送完毕,再继续处理下一封邮件。如果我有 100 封电子邮件要发送,那么它将是一个 100 人的队列,而不是并行发送。这正是我在断点时看到的。
  • @MikeFlynn 你能展示你是如何处理电子邮件的吗?我觉得这可能是一个 XR 问题。我得到的感觉是,您有一个要拨打的电话清单,并且应该在 Task.WhenAll 中,但在我更好地了解更大的系统之前,我不确定。
  • 我认为这行得通。我将这些任务的列表存储在列表中。然后在应用程序结束时,我执行了WhenAll,现在似乎两者都发送没有问题。我认为这个 async/wait/whenall 的东西没有缺点?
  • @MikeFlynn Task.WhenAll 和 TPL 相关的 API 在框架内相当稳定。我建议对任务进行批处理以帮助管理可用线程。
猜你喜欢
  • 2012-09-15
  • 2011-11-07
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多