public async Task GenerateAsync() { var readFile = new TransformBlock <string, string>(async path => { string fileContent; using (StreamReader reader = File.OpenText(path)) { fileContent = await reader.ReadToEndAsync(); } return(fileContent); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = _maxFilesToRead }); var getTest = new TransformBlock <string, List <CSharpFile> >(source => { NUnitTestGenerator nUnitTestGenerator = new NUnitTestGenerator(); var generatedTests = nUnitTestGenerator.Generate(source); List <CSharpFile> results = new List <CSharpFile>(); foreach (var generatedTest in generatedTests) { string generatedTestStr = generatedTest.ToString(); string testName = ""; string[] words = generatedTestStr.Split(' '); for (int i = 0; i < words.Length; i++) { if (words[i] == "class") { i++; testName = words[i].Trim(' ', '\r', '\n', '\t'); } } results.Add(new CSharpFile(Path.GetFullPath(_testfolder) + "\\" + testName + "Test.cs", generatedTestStr)); } return(results); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = _maxThreads }); var writeResult = new ActionBlock <List <CSharpFile> >(async csharpFiles => { foreach (var csharpFile in csharpFiles) { using (StreamWriter writer = File.CreateText(csharpFile.Filename)) { await writer.WriteAsync(csharpFile.Text); } } }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = _maxFilesToWrite }); // // Connect the dataflow blocks to form a pipeline. // var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; readFile.LinkTo(getTest, linkOptions); getTest.LinkTo(writeResult, linkOptions); foreach (string file in _filesfortest) { readFile.Post(file); } readFile.Complete(); await writeResult.Completion; }