【发布时间】:2017-10-11 13:13:18
【问题描述】:
我希望服务器通过邮件更新用户,因为邮件发送大约需要 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 运行时将尝试延迟关闭。但它仍然关闭。我在这里做错了什么?即使请求完成,如何强制我的应用程序继续运行。
【问题讨论】:
-
我从来没有经历过这样的事情。 “取消您的后台操作”意味着异常处理程序被相应的
OperationCanceledException? -
异常ex为null
-
是什么让你认为操作被取消了?您是如何确认这一点的?
-
我认为它是 dit,因为 client.send(message) 在本地计算机和 Windows 服务器上都可以工作,但是当将代码放入 QueueBackgroundWorkItem() 时,记录器会被命中,但仅在 Windows 服务器上。
-
不客气。只是一个想法:也许你过早地处理了
SmtpClient。
标签: c# asp.net-mvc asynchronous queue