C# ASP.NET MVC中的后台操作

C# ASP.NET MVC中的后台操作,c#,asp.net-mvc,asynchronous,async-await,C#,Asp.net Mvc,Asynchronous,Async Await,在我的ASP.NET MVC 5应用程序中,我将长期运行的数据库查询的结果作为LRU缓存进行缓存。每当用户请求这样的结果时,应用程序首先检查它是否已被缓存。。。如果在缓存中找到,应用程序将返回缓存结果。否则,应用程序将执行查询,然后缓存结果 在某些情况下,应用程序可能需要写入大量缓存项(>10000)。是否有一种方法可以立即响应用户的请求并在后台写入缓存 我正在考虑以一种类似于火和遗忘的方式写入缓存,从而使写入缓存异步的方法无效。我不关心该方法的任何结果,不管它是否失败,也不管它是否在下一个请求

在我的ASP.NET MVC 5应用程序中,我将长期运行的数据库查询的结果作为LRU缓存进行缓存。每当用户请求这样的结果时,应用程序首先检查它是否已被缓存。。。如果在缓存中找到,应用程序将返回缓存结果。否则,应用程序将执行查询,然后缓存结果

在某些情况下,应用程序可能需要写入大量缓存项(>10000)。是否有一种方法可以立即响应用户的请求并在后台写入缓存

我正在考虑以一种类似于火和遗忘的方式写入缓存,从而使写入缓存异步的方法无效。我不关心该方法的任何结果,不管它是否失败,也不管它是否在下一个请求到达应用程序之前完成……(应用程序不以任何方式取决于存在的缓存项)


在ASP.NET MVC中使用async void是一个好主意还是会导致问题?如果没有,那么在不让用户等待的情况下写入缓存的正确解决方案是什么?

您可以返回void并使用来填充缓存


QueueBackgroundWorkItem提供了一种安全的方式来运行短期后台任务。

您可以返回void并使用它来填充缓存

QueueBackgroundWorkItem提供了一种运行短期后台任务的安全方法。

请查看:

“挂起火:在ASP.NET应用程序中执行火与忘、延迟和重复任务的简单方法。无需Windows服务。”

请查看:


“挂起火灾:在ASP.NET应用程序中执行火灾和遗忘、延迟和重复任务的简单方法。不需要Windows服务。”

这可能会有所帮助:您应该避免
异步无效
,除非您必须具有该签名才能匹配某些.NET Framework事件。您应该改为使用
异步任务
。这在中的MSDN上都有解释。最初,所有异步函数(属于.Net 4.5的一部分)都应该只返回任务或任务,但与数百万已在.Net world C中编写的事件处理程序具有向后兼容性,编译器设计人员考虑接受此异常。所有事件处理程序(如充当按钮单击等事件回调的方法)都具有void ClickEventHandler(objectsender,EventArgs e)等签名。如果异步函数不接受void返回类型,则所有此类函数都不可能成为异步函数。因此,对于异步函数的所有常见用例(事件处理程序除外),返回类型应始终为Task或Task。同样从可扩展性的角度来看,今天您可能没有使用其他TPL功能,如continueWith等,但是如果明天您想做类似的事情,那么您将最终修改方法的签名,这将使您感到沮丧。因此最好提前准备。这可能会有所帮助:您应该避免
async void
,除非您必须具有该签名才能匹配某些.NET Framework事件。您应该改为使用
异步任务
。这在中的MSDN上都有解释。最初,所有异步函数(属于.Net 4.5的一部分)都应该只返回任务或任务,但与数百万已在.Net world C中编写的事件处理程序具有向后兼容性,编译器设计人员考虑接受此异常。所有事件处理程序(如充当按钮单击等事件回调的方法)都具有void ClickEventHandler(objectsender,EventArgs e)等签名。如果异步函数不接受void返回类型,则所有此类函数都不可能成为异步函数。因此,对于异步函数的所有常见用例(事件处理程序除外),返回类型应始终为Task或Task。同样从可扩展性的角度来看,今天您可能没有使用其他TPL功能,如continueWith等,但是如果明天您想做类似的事情,那么您将最终修改方法的签名,这将使您感到沮丧。因此,最好提前准备。