ASP.NET中的HostingEnvironment.QueueBackgroundWorkItem()用于小型后台任务

时间:2016-08-28 18:55:45

标签: c# asp.net asp.net-mvc asp.net-web-api

我遇到了一个在v4.5.2中添加到ASP.NET的漂亮小工具

我正在徘徊它是多么安全以及如何在ASP.NET MVC或Web API场景中有效地利用它。

我知道我总是希望在我的网络应用程序中快速简单地执行任务并忘记任务。例如:

  • 发送电子邮件
  • 发送推送通知
  • 将分析或错误记录到数据库

现在通常我只创建一个名为

的方法
public async Task SendEmailAsync(string to, string body)
{
 //TODO: send email
}

我会像这样使用它:

public async Task<ActionResult> Index()
{
 ...
 await SendEmailAsync(User.Identity.Username, "Hello");
return View(); 
}

现在我对此的担忧是,我要推迟用户以便向我们发送电子邮件。这对我来说没有多大意义。

所以我首先考虑过这样做:

Task.Run(()=> SendEmailAsync(User.Identity.Username, "Hello"));
然而,当读到这个。在IIS环境中显然不是最好的事情。 (我不能100%确定具体细节)。

所以这就是我遇到HostingEnvironment.QueueBackgroundWorkItem(x=> SendEmailAsync(User.Identity.Username, "Hello"));

的地方

这是一种非常快速简便的方法,可以将发送电子邮件任务卸载给后台工作人员,并更快地为用户View()提供服务。

现在我知道这不适用于运行时间超过90 seconds并且不是100%保证执行的任务。

但我的问题是:

HostingEnvironment.QueueBackgroundWorkItem()是否足以满足:在标准ASP.NET网站中发送电子邮件,推送通知,数据库查询等。

1 个答案:

答案 0 :(得分:3)

取决于。

QueueBackgroundWorkItem的主要好处如下,强调我的(source):

  

与普通的ThreadPool工作项不同,ASP.NET可以跟踪当前正在运行的API注册的工作项数, ASP.NET运行时将尝试延迟AppDomain关闭直到这些工作项目完成执行。

基本上,QueueBackgroundWorkItem可帮助您运行可能需要几秒钟的任务,尝试在任务仍在运行时不关闭应用程序。

运行正常的数据库查询或发送推送通知应该是几百毫秒(或几秒)的事情;既不应该花费很长时间,也应该在QueueBackgroundWorkItem内运行。

但是,无法保证完成任务 - 正如您所说,任务不是await。这一切都取决于执行任务的重要性。如果任务必须完成,那么它不适合QueueBackgroundWorkItem