无需等待即可启动任务

本文关键字:启动 任务 等待 | 更新日期: 2023-09-27 18:35:08

我正在使用 asp.net mvc,我想在用户到达网站主页时从数据库中缓存一些有关用户的数据。因此,当用户请求主页时,我想调用一个异步方法,该方法进行数据库调用并缓存数据。

这样做的任何示例都会很棒。

无需等待即可启动任务

public class HomeController : Controller
{
  public ActionResult Index()
  {
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    Task.Run(()=> DoSomeAsyncStuff());
    return View();
  }
  private async void DoSomeAsyncStuff()
  {
  }
}

对于 .NET Core,我使用这个

_ = Task.Run(() => SomeAsyncFunction());

最高投票的答案都建议使用 Task.Run ,这对于 ASP.NET Core 来说是一个非常糟糕的做法,因为它可能会导致线程匮乏(因为Task.Run调度任务在线程池上运行,并且 http 请求处理需要线程池线程)。

如果你真的想"触发并忘记"一个(a)真正异步的方法,(b)该方法处理其中的所有异常,那么只需做:

_ = DoSomething();

假设方法是

public async Task DoSomething()
{
}

我会说你通过以下方式调用缓存方法:

HostingEnvironment.QueueBackgroundWorkItem(x=> CacheData());

这样,您就不会真正保持主页请求等待,以便用户可以立即看到主页,而缓存在服务器的后台进行。

PS:但是,是的,您冒着应用程序域回收搞砸缓存线程的轻微风险。

ThreadPool.QueueUserWorkItem((Action<object>)state =>
{
    //do your async work
}, null);

Task.StartNew(...)

(很抱歉简短的回答,这可能会带您走上正确的轨道,或者有人可以编辑它以显示完整的示例,请?