Beispiel #1
0
        public StartableBlock <DataBatch <Person> > Create(string targetFilePath, IProgress <PipelineProgress> progress, CancellationToken cancellation)
        {
            File.Create(targetFilePath).Dispose();
            var builtSummary = new PeopleSummary();

            // Create pipelines
            var summaryFromDbPipeline = CreateSummaryFormDbPipeline(targetFilePath, progress, cancellation);

            var writeEmptyLineBlock1 = new StartableBlock <object>(
                () =>
            {
                if (!summaryFromDbPipeline.Completion.IsFaulted && !summaryFromDbPipeline.Completion.IsCanceled)
                {
                    File.AppendAllLines(targetFilePath, new[] { string.Empty });
                }
            });

            var peoplePipeline = CreatePeoplePipeline(targetFilePath, builtSummary, progress, cancellation);

            var writeEmptyLineBlock2 = new StartableBlock <object>(
                () =>
            {
                if (!peoplePipeline.Completion.IsFaulted && !peoplePipeline.Completion.IsCanceled)
                {
                    File.AppendAllLines(targetFilePath, new[] { string.Empty });
                }
            });

            var builtSummaryPipeline = CreateBuiltSummaryPipeline(targetFilePath, builtSummary, progress, cancellation);

            // Link pipelines
            summaryFromDbPipeline.ContinueWith(writeEmptyLineBlock1);
            writeEmptyLineBlock1.ContinueWith(peoplePipeline);
            peoplePipeline.ContinueWith(writeEmptyLineBlock2, false);
            writeEmptyLineBlock2.ContinueWith(builtSummaryPipeline);
            builtSummaryPipeline.Output.IgnoreOutput();

            return(new StartableBlock <DataBatch <Person> >(
                       summaryFromDbPipeline.Start,
                       peoplePipeline.Output,
                       peoplePipeline.EstimatedOutputCount,
                       builtSummaryPipeline.Completion,
                       true));
        }