我希望服务器通过邮件更新用户,因为邮件需要大约5秒钟,我想在后台线程上运行它。问题是IIS取消我的后台操作才能完成。
以下代码在Visual Studio中测试时有效,但在Windows服务器上测试时无效:
HostingEnvironment.QueueBackgroundWorkItem(ct => ProgressMail(ct, smtpSend, emailMessage));
我的progressmail方法如下:
private static void ProgressMail(CancellationToken ct, SmtpClient client, MailMessage message)
{
try
{
ct.ThrowIfCancellationRequested();
client.Send(message);
}
catch (Exception ex)
{
Log.Logger.Error("Error sending mail in background thread", ex);
}
}
msdn上的Microsoft文档声明如下:
与普通的ThreadPool工作项不同,ASP.NET可以跟踪当前正在运行的通过此API注册的工作项数,并且ASP.NET运行时将尝试延迟AppDomain关闭,直到这些工作项完成执行。无法在ASP.NET管理的AppDomain之外调用此API。提交的CancellationToken将在应用程序关闭时发出信号。
ASP.NET Runtime会尝试延迟关机。但它仍在关闭。我在这做错了什么?即使请求完成,我如何强制我的应用程序继续运行。
答案 0 :(得分:0)
感谢@Peit,我知道要更密切地关注SMTPClient
,而不是关注
HostingEnviroment.QueueBackgroundItem()
问题在于在IIS上发送带有SMTP的电子邮件。不得不补充:
client.DeliveryMethod = SmtpDeliveryMethod.Network;
现在它正在使用localhost和IIS:)