我遇到了一个在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网站中发送电子邮件,推送通知,数据库查询等。
答案 0 :(得分:3)
取决于。
QueueBackgroundWorkItem
的主要好处如下,强调我的(source):
与普通的ThreadPool工作项不同,ASP.NET可以跟踪当前正在运行的API注册的工作项数, ASP.NET运行时将尝试延迟AppDomain关闭直到这些工作项目完成执行。
基本上,QueueBackgroundWorkItem
可帮助您运行可能需要几秒钟的任务,尝试在任务仍在运行时不关闭应用程序。
运行正常的数据库查询或发送推送通知应该是几百毫秒(或几秒)的事情;既不应该花费很长时间,也应该在QueueBackgroundWorkItem
内运行。
但是,无法保证完成任务 - 正如您所说,任务不是await
。这一切都取决于执行任务的重要性。如果任务必须完成,那么它不适合QueueBackgroundWorkItem
。