public IEnumerable <IMetaData> GetMetadatasFromAList(string pathToFile, int numberOfLines, bool order = false) { Console.WriteLine($"Inside {nameof(TplDataflow9FullSampleControllerWithExecutionBlocks)} - {nameof(GetMetadatasFromAList)}"); CommonHelpers.CleanWorkingDirectory(SavedImageDirectory); var listOfMetadata = new List <IMetaData>(); if (string.IsNullOrWhiteSpace(pathToFile)) { return(Functions.ReturnOnlyOneMetadaInError("The path file is null or empty")); } if (numberOfLines < 1) { return(Functions.ReturnOnlyOneMetadaInError("You aks for number of line lower than 1")); } // Create the members of the pipeline. var transformBlockStreamTextContent = new TransformBlock <string, string>(uri => Functions.StreamTextContent(uri) ); var transformBlockTranformContentIntoListOfUri = new TransformBlock <string, IList <string> >(content => Functions.TranformContentIntoListOfUri(content, numberOfLines) ); var transformManyBlockTransformListIntoSeveralUris = new TransformManyBlock <IList <string>, string>(listOfUri => Functions.TransformListIntoSeveralUris(listOfUri) ); var transformBlockDownloadImageData = new TransformBlock <string, IMetaData>(url => Functions.DownloadImageData(url, SavedImageDirectory) ); var actionBlockSetStatusOfProcess = new ActionBlock <IMetaData>(metadata => Functions.SetStatusOfProcess(listOfMetadata, metadata) ); // Connect the dataflow blocks to form a pipeline. transformBlockStreamTextContent.LinkTo(transformBlockTranformContentIntoListOfUri, DataflowOptions.LinkOptions); transformBlockTranformContentIntoListOfUri.LinkTo(transformManyBlockTransformListIntoSeveralUris, DataflowOptions.LinkOptions); transformManyBlockTransformListIntoSeveralUris.LinkTo(transformBlockDownloadImageData, DataflowOptions.LinkOptions); transformBlockDownloadImageData.LinkTo(actionBlockSetStatusOfProcess, DataflowOptions.LinkOptions); // Start GetMetadatasFromAList pipeline with the input values. transformBlockStreamTextContent.Post(pathToFile); // Mark the head of the pipeline as complete. transformBlockStreamTextContent.Complete(); // Wait for the last block in the pipeline to process all messages. actionBlockSetStatusOfProcess.Completion.Wait(); return(order ? listOfMetadata.OrderByDescending(metadata => metadata.Status) : (IEnumerable <IMetaData>)listOfMetadata); }