public async Task <IEnumerable <Item> > LoadItems(IEnumerable <DestinyItemComponent> itemComponents, IDictionary <long, DestinyItemInstanceComponent> itemInstances, IDictionary <long, DestinyItemStatsComponent> itemStats, IDictionary <long, DestinyItemSocketsComponent> itemSockets, IEnumerable <Mod> mods, IEnumerable <Mod> shaders) { var tasks = itemComponents.Select(async itemComponent => { var itemDef = await _cache.GetInventoryItemDef(itemComponent.ItemHash); var bucket = await _cache.GetBucketDef(itemDef.Inventory.BucketTypeHash); return(new { itemComponent, itemDef, bucket }); }); var info = await Task.WhenAll(tasks); var info2 = info.Where(item => ShouldInclude(item.bucket)); var itemTasks = info2.Select(async item => { itemInstances.TryGetValue(item.itemComponent.ItemInstanceId, out var instance); itemStats.TryGetValue(item.itemComponent.ItemInstanceId, out var statsComponent); itemSockets.TryGetValue(item.itemComponent.ItemInstanceId, out var socketsComponent); var statsTask = _statFactory.LoadStats(instance.PrimaryStat, statsComponent?.Stats); var socketsTask = _socketFactory.LoadActiveSockets(item.itemDef.Sockets, socketsComponent.Sockets); await Task.WhenAll(statsTask, socketsTask); return(new Item(_bungie.BaseUrl, item.itemDef, item.bucket, item.itemComponent.ItemInstanceId, instance, statsTask.Result, socketsTask.Result)); }); var items = await Task.WhenAll(itemTasks); return(items); }