public async Task Perform() { while (sourceProvider.HasNext()) { var item = await sourceProvider.GetNext(); var metadatas = new ConcurrentDictionary <string, IMetadata>(); metadataProviders.AsParallel().ForAll(async mp => metadatas.TryAdd(mp.Name, await mp.GetMetadata(item))); databaseProvider.Add(item, metadatas); } }