private void KickOffViewPrecompiling(TinyIoCContainer container) { Logging.Log.Info("Precompiling razor views in background"); RazorViewEngine engine = container.Resolve<RazorViewEngine>(); IViewLocator locator = container.Resolve<Nancy.ViewEngines.IViewLocator>(); IRenderContextFactory renderContextFactory = container.Resolve<IRenderContextFactory>(); RazorPreloader preloader = new RazorPreloader(engine, locator, renderContextFactory); foreach (var pathAndModel in ViewPathsAndModels) { // Avoid capturing the loop variable, it does not work how you expect it to work in some .NET versions. // No idea what mono does with it. string viewPath = pathAndModel.Key; object viewModel = pathAndModel.Value; ThreadPool.QueueUserWorkItem(x => PrecompileView(viewPath, viewModel, engine, locator, renderContextFactory, preloader)); } }
private static void PrecompileView(string viewPath, object viewModel, RazorViewEngine engine, IViewLocator locator, IRenderContextFactory renderContextFactory, RazorPreloader preloader) { try { Logging.Log.DebugFormat("Precompiling view {0}", viewPath); preloader.PreloadRazorView(viewPath, viewModel); Logging.Log.DebugFormat("Finished precompiling view {0}", viewPath); } catch (Exception ex) { Logging.Log.ErrorFormat("Error precompiling view {0}: {1}", ex, viewPath, ex.Message); } lock (ViewsFinishedPrecompiling) { ViewsFinishedPrecompiling.Add(viewPath); if (ViewsFinishedPrecompiling.Count == ViewPathsAndModels.Count) { Logging.Log.Info("Finished precompiling views"); } } }