private List <CharacterModel> LoadCharacterModels(bool unique) { if (_cache.TryLoadCache(out var cached)) { var validCached = cached.Where(x => x.UniqueCharacter == unique).ToList(); if (validCached.Any()) { return(validCached); } } else { cached = new List <CharacterModel>(); } var files = Prefetch.Load().Files.Keys; var modelBag = new ConcurrentBag <CharacterModel>(); var tasks = new ParallelTasks <string>( Environment.ProcessorCount, file => { if (IsValid(file, unique)) { foreach (var model in GetCharacterModels(file)) { modelBag.Add(model); } } }); tasks.Start(); tasks.AddItems(files); tasks.WaitForComplete(); GC.Collect(); var modelList = modelBag.ToList(); cached.AddRange(modelList); _cache.Save(cached); return(modelList); }
private List <T> LoadInternal() { if (_cache.TryLoadCache(out var cached)) { if (cached.Any()) { return(cached); } } else { cached = new List <T>(); } var files = Prefetch.Load().Files.Keys; var bag = new ConcurrentBag <T>(); var parallels = IoC.Debug.SingleThread ? 1 : Environment.ProcessorCount; var tasks = new ParallelTasks <string>( parallels, file => { if (_fileNameValidator(file) && !Ignored.Any(x => x.IsMatch(file))) { foreach (var item in _itemGetter(file)) { bag.Add(item); } } }); tasks.Start(); tasks.AddItems(files); tasks.WaitForComplete(); GC.Collect(); var itemList = bag.ToList(); cached.AddRange(itemList); _cache.Save(cached); return(itemList); }