无需等待即可启动任务
本文关键字:启动 任务 等待 | 更新日期: 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(...)
(很抱歉简短的回答,这可能会带您走上正确的轨道,或者有人可以编辑它以显示完整的示例,请?