2011-04-21 139 views
1

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

我明显不希望网站花40分钟启动,所以只需在Application_Start中加入预加载过程并不是一个真正的选择。我无法将其移出Web应用程序的上下文(即Windows服务或外部进程),因为我需要访问缓存。理想情况下,这项任务将被异步执行,同时让该网站开展业务。一位同事建议使用BackgroundWorker class分拆一个新线程,这听起来像是一个很好的解决方案。但是,据我所知,这个特定的类实际上并不适用于ASP.NET,而是WinForms。我担心线程在完成之前可能会被中断。

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

UPDATE:

我会看看到Windows AppFabric中更好的缓存,我可以从Web应用程序之外加载。但是,在此之前,我必须继续使用ASP.NET缓存和BackgroundWorker类。这不起作用,我问了一个新问题,Load objects into cache from new thread

+0

什么是“元素”? – 2011-04-21 08:35:34

+1

我们内部搜索的结果集。也许我应该改为“对象”呢? :) – 2011-04-21 08:36:34

+0

如果你只是想剥离一个新的线程,那么“新线程()”有什么不对? – 2011-04-21 08:42:41

回答

1

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

例如,请参阅微软的功能强大的Enterprise Library Caching application block(虽然还有其他许多功能)。我们使用它来共享50个网站之间的缓存,并在控制台应用程序中隔夜填充缓存。

无论您如何生成缓存(进程内或进程外),将其与数据库一起备份是明智的,否则,如果重新启动应用程序,则大多数映像将在40分钟内不可用或者更多。

+0

我认为你是对的。也许ASP.NET System.Web.Cache并不是解决此问题的正确工具。 – 2011-04-21 08:50:47

1

您需要一个持久视图模型商店!

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

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

+0

正如我评论@RB,我认为你(都)是正确的。也许我只需要离开内置缓存,看起来不那么封闭。 – 2011-04-21 08:51:54

0

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

此外,根据您的应用程序负载/规模,您希望考虑由某些持久性存储支持的进程外缓存服务器或缓存(出于性能原因,您仍然需要进程内缓存,如ASP.NET缓存) 。这种方案的好处是缓存在应用程序重新启动时的有效性,相同的缓存可以支持群集中的多个Web服务器,缓存失效/更新可以通过集中控制器等进行处理。当然,如上所述,只有存在需要它。

+0

如果在预加载器到达那个位置之前请求该项目,它只是正常缓存。预加载程序看到该项目已被缓存,并转到下一个... – 2011-04-21 08:49:25

+0

@jacob,那么你真的没有任何问题 - 只是旋转一个不同的线程来预加载缓存。 – VinayC 2011-04-21 08:53:12

+0

感谢您的回答:我继续尝试了BackgroundWorker类。不幸的是,它不工作。请参阅http://stackoverflow.com/questions/5754612/load-objects-into-cache-from-new-thread ... – 2011-04-22 10:46:29

1

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

有一篇很好的MSDN文章解释了不同的TPL行为here

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

+0

感谢指针,但我们仍然坚持在.NET 3.5 ...:/ – 2011-04-21 09:48:50