我试图迫使ASP.NET站点在启动时将大量对象预加载到缓存中。每个对象需要2-10秒才能生成,这意味着按顺序加载1200+对象需要40分钟以上才能完成。
我显然不想在网站上花40分钟来启动,所以只在Application_Start中粘贴预加载过程并不是一个真正的选择。而且我不能将它移出web应用程序的上下文(即Windows服务或外部进程),因为我需要访问缓存。理想情况下,这个任务将异步执行,同时让站点继续其业务。一位同事建议使用BackgroundWorker类来分离一个新线程,这听起来是个不错的解决方案。然而,据我所见,这个特定的类实际上不是针对ASP.NET的,而是针对WinForms的。我担心线程可能会在它完成之前被切断。
更新:
我将查看Windows,以获得更好的缓存,我可以从AppFabric应用程序外部加载缓存。但是,在此之前,我必须继续使用ASP.NET缓存和BackgroundWorker类。这不管用,我问了一个新问题,从新线程将对象加载到缓存中。
发布于 2011-04-21 08:37:01
另一种方法是使用数据库支持的缓存。这样,您的Windows服务(例如)可以写入数据库,但它仍然可以从ASP.NET应用程序中访问。
例如,参见微软的功能完善的企业库缓存应用程序块 (尽管还有很多其他的)。我们使用它在50个网站之间共享一个缓存,并在一夜之间从控制台应用程序填充缓存。
无论您如何生成缓存(进程内或进程外),使用数据库备份它是明智的,否则如果重新启动应用程序,大多数映像将在40分钟或更长时间内不可用。
发布于 2011-04-21 08:41:38
您需要一个持久的视图模型存储!
例如,执行这些搜索并将结果存储在文档数据库中。看看RavenDb。这样,就可以将任何对象序列化到数据库中,并获得查询数据的子秒响应时间。
然后,您可以使用任何东西来执行这项工作,并使用ASP.NET网络应用程序进行演示。
发布于 2011-04-21 09:45:16
使用任务并行库 (如果您使用的是.Net 4.0)。TPL的每个实现都是针对特定主机设计的,还有一个用于ASP.NET,这意味着您有自己的TaskScheduler和SynchronizationContext,它们符合IIS在线程和线程上下文方面强加的规则。
有一篇很好的MSDN文章解释了不同的TPL行为这里。
如果您熟悉Lambda表达式,使用TPL非常简单,并且可以节省大量管理线程和线程池的地下代码。
https://stackoverflow.com/questions/5741543
复制相似问题