C# ASP.NET中的异步任务

C# ASP.NET中的异步任务,c#,asp.net,caching,.net-3.5,asynchronous,C#,Asp.net,Caching,.net 3.5,Asynchronous,我试图强制ASP.NET站点在启动时将大量对象预加载到缓存中。每个对象需要2-10秒才能生成,这意味着按顺序加载1200多个对象需要40分钟以上才能完成 很明显,我不希望站点需要40分钟才能启动,所以在Application_Start中执行预加载过程并不是一个真正的选项。我无法将其移动到web应用程序(即Windows服务或外部进程)的上下文之外,因为我需要访问缓存。理想情况下,此任务将异步执行,同时让站点继续其业务。一位同事建议使用新线程来衍生新线程,这听起来是一个不错的解决方案。然而,就我

我试图强制ASP.NET站点在启动时将大量对象预加载到缓存中。每个对象需要2-10秒才能生成,这意味着按顺序加载1200多个对象需要40分钟以上才能完成

很明显,我不希望站点需要40分钟才能启动,所以在Application_Start中执行预加载过程并不是一个真正的选项。我无法将其移动到web应用程序(即Windows服务或外部进程)的上下文之外,因为我需要访问缓存。理想情况下,此任务将异步执行,同时让站点继续其业务。一位同事建议使用新线程来衍生新线程,这听起来是一个不错的解决方案。然而,就我所见,这个特定的类实际上不是为ASP.NET设计的,而是为WinForms设计的。我担心线程可能会在完成之前被终止

  • BackgroundWorker类在ASP.NET应用程序中使用是否安全
  • 我还有什么其他选择来解决这个问题
更新:


我将研究Windows AppFabric以获得更好的缓存,我可以从web应用程序外部加载这些缓存。但是,在此之前,我必须继续使用ASP.NET缓存和BackgroundWorker类。它不起作用了,我问了一个新问题。

另一种方法是使用数据库支持的缓存。这样,您的Windows服务(例如)可以写入数据库,但仍可从ASP.NET应用程序访问该数据库

例如,请看微软的功能强大的产品(尽管还有很多其他产品)。我们使用它在50个网站之间共享一个缓存,并在一夜之间从控制台应用程序填充缓存


无论您如何生成缓存(进程内或进程外),最好使用数据库对其进行备份,否则如果重新启动应用程序,大多数图像将在40分钟或更长时间内不可用。

您需要一个持久视图模型存储

例如,执行这些搜索并将结果存储在文档数据库中。看一看。这样,您就可以将任何对象序列化到数据库中,并在查询数据时获得亚秒的响应时间


然后,您可以使用任何东西来执行工作,并使用ASP.NET Web应用程序进行演示

是-您可以启动不同的工作线程(或后台工作类)来加载缓存。但是,您无论如何都必须支持按需(不按顺序)加载缓存元素,因为在缓存完全准备好之前可能需要它

此外,基于应用程序加载/比例,您需要考虑一个进程外的缓存服务器或一些持久性存储支持的缓存(由于性能原因,您仍然需要进程缓存,例如ASP.NET缓存)。这种方案的优点是缓存的有效性优于应用程序重启,同一个缓存可以支持集群中的多个web服务器,缓存失效/更新可以通过集中式控制器处理,等等。当然,如前所述,只有在需要时,我才会在这里查看

使用(如果您使用的是.Net 4.0)。TPL的每个实现都是为特定的主机设计的,还有一个是为ASP.NET设计的,这意味着您有自己的TaskScheduler和SynchronizationContext,它们符合IIS在线程和线程上下文方面强加的规则

有一篇很好的MSDN文章解释了不同的第三方物流行为


如果您熟悉Lambda表达式,那么使用TPL非常简单,并为您节省了大量管理线程和线程池的地下代码。

我们内部搜索的结果集。也许我应该把它改成“objects”?:)如果你只是想衍生出一个新的线程,“new thread()”有什么问题吗?@Pauli,我认为同样的担忧也适用于此?我只是需要一些非常健壮的东西来处理这个问题,从我所读到的内容来看,ASP.NET中的多线程并不是你真正应该玩弄的东西。在ASP.NET中处理几个异步任务和线程并没有什么错。我同意其他人的意见,虽然缓存的填充可以由asp.net应用程序中运行的线程来处理,它的位置应该类似于memcached或序列化到数据库中,这样你就不必在每次应用程序重新启动时都重新创建它。如果在预加载程序启动之前请求了该项目,它就会正常缓存。预加载程序看到项目已经被缓存并继续下一个…@jacob,那么你真的没有任何问题-只需旋转另一个线程来预加载缓存。谢谢你的回答:我继续并尝试了BackgroundWorker类。不幸的是,它不起作用了。看,我想你是对的。也许ASP.NET System.Web.Cache不是解决这个问题的合适工具。正如我用@RB评论的那样,我认为你们(都)是对的。也许我只需要离开内置的缓存,让它看起来不那么封闭。谢谢你的指点,但我们仍然停留在.NET 3.5…:/