HostingEnviroment.QueueBackgroundWorkItem适用于localhost但在IIS

时间:2017-10-11 13:13:18

标签: c# asp.net-mvc asynchronous queue

我希望服务器通过邮件更新用户,因为邮件需要大约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会尝试延迟关机。但它仍在关闭。我在这做错了什么?即使请求完成,我如何强制我的应用程序继续运行。

1 个答案:

答案 0 :(得分:0)

感谢@Peit,我知道要更密切地关注SMTPClient,而不是关注 HostingEnviroment.QueueBackgroundItem()

问题在于在IIS上发送带有SMTP的电子邮件。不得不补充:

client.DeliveryMethod = SmtpDeliveryMethod.Network;

现在它正在使用localhost和IIS:)