public void StartCreatingFeeds(Func <FeedFileCreationContext, bool> createFeed, string secondFileName = null) { try { using (var scope = new DbContextScope(autoDetectChanges: false, validateOnSave: false, forceNoTracking: true)) { _cachedPathes = null; _cachedCategories = null; var storeService = _ctx.Resolve <IStoreService>(); var stores = new List <Store>(); if (BaseSettings.StoreId != 0) { var storeById = storeService.GetStoreById(BaseSettings.StoreId); if (storeById != null) { stores.Add(storeById); } } if (stores.Count == 0) { stores.AddRange(storeService.GetAllStores()); } var context = new FeedFileCreationContext() { StoreCount = stores.Count, Progress = new Progress <FeedFileCreationProgress>(x => { AsyncState.Current.Set(x, SystemName); }) }; foreach (var store in stores) { var feedFile = GetFeedFileByStore(store, secondFileName); if (feedFile != null) { AppPath.Delete(feedFile.FileTempPath); if (secondFileName.HasValue()) { AppPath.Delete(feedFile.CustomProperties["SecondFileTempPath"] as string); } using (var stream = new FileStream(feedFile.FileTempPath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) using (var logger = new TraceLogger(feedFile.LogPath)) { context.Stream = stream; context.Logger = logger; context.Store = store; context.FeedFileUrl = feedFile.FileUrl; if (secondFileName.HasValue()) { context.SecondFilePath = feedFile.CustomProperties["SecondFileTempPath"] as string; } if (!createFeed(context)) { break; } } AppPath.Copy(feedFile.FileTempPath, feedFile.FilePath); if (secondFileName.HasValue()) { AppPath.Copy(context.SecondFilePath, feedFile.CustomProperties["SecondFilePath"] as string); } } } } } finally { AsyncState.Current.Remove <FeedFileCreationProgress>(SystemName); } }