【问题标题】:HostingEnvironment.QueueBackgroundWorkItem() in ASP.NET for small background tasksASP.NET 中的 HostingEnvironment.QueueBackgroundWorkItem() 用于小型后台任务
【发布时间】:2016-08-29 03:08:25
【问题描述】:

我发现了一个不错的小工具,它已在 v4.5.2 中添加到 ASP.NET

我想知道它有多安全,以及如何在 ASP.NET MVC 或 Web API 场景中有效地利用它。

我知道我一直想在我的 Web 应用程序中执行快速简单的触发和遗忘任务。例如:

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

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

的方法
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=&gt; SendEmailAsync(User.Identity.Username, "Hello"));的地方

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

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

但我的问题是:

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

【问题讨论】:

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


    【解决方案1】:

    视情况而定。


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

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

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

    运行一个普通的数据库查询或发送一个推送通知应该是几百毫秒(或几秒钟)的事情;两者都不应该花费很长时间,因此应该可以在 QueueBackgroundWorkItem 内运行。

    但是,不能保证任务完成——正如你所说,任务不是awaited。这完全取决于要执行的任务的重要性。如果任务必须完成,那么QueueBackgroundWorkItem 不适合。

    【讨论】:

    • 所以这只是为 IIS 应用程序池提供了一个信号量来防止定时回收?很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多