public async Task<bool> TryGenerate(GeneratorParams parameters) { var batches = new Batch[parameters.BatchCount]; await Task.Run(() => { Parallel.For(0, parameters.BatchCount, i => { batches[i] = batchCreator.CreateBatch(i.GetHashCode(), parameters); }); }); var batchesWithFileNames = batches.Select((batch, batchIndex) => new { Batch = batch, FilePath = MakeFinalFileName(batchIndex, batch, parameters) }); return (await Task.WhenAll(batchesWithFileNames.Select(async item => new { Result = await batchWriter.TryWriteBatchFile(item.FilePath, item.Batch), Path = item.FilePath }))).All(item => item.Result); }