C# TPL数据流转换块post到批处理块,后跟actionblock

C# TPL数据流转换块post到批处理块,后跟actionblock,c#,.net,task-parallel-library,tpl-dataflow,C#,.net,Task Parallel Library,Tpl Dataflow,我有一个基于TPL数据流的应用程序,只需使用批处理块,然后是操作块,就可以很好地工作 在发布到批处理块之前,我添加了一个TransformBlock,以尝试从源代码中转换数据,但我的操作块从未被命中。没有引发任何错误或异常 我不确定是否需要完成转换块,因为它似乎只被击中一次 除了返回输出类型的对象之外,是否还有其他步骤需要添加到转换代码中 using System; using System.Collections.Generic; using System.Linq; using System

我有一个基于TPL数据流的应用程序,只需使用批处理块,然后是操作块,就可以很好地工作

在发布到批处理块之前,我添加了一个TransformBlock,以尝试从源代码中转换数据,但我的操作块从未被命中。没有引发任何错误或异常

我不确定是否需要完成转换块,因为它似乎只被击中一次

除了返回输出类型的对象之外,是否还有其他步骤需要添加到转换代码中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;

namespace DataflowTest
{
    class Program
    {
        public const int BATCH_SIZE = 10;
        static void Main(string[] args)
        {
            Console.WriteLine("Application started");

            //Create the pipeline of actions
            var transformBlock = new TransformBlock<string, string>(input => TransformString(input), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 });
            var batchBlock = new BatchBlock<string>(BATCH_SIZE);
            var uploadFilesToAzureBlock = new ActionBlock<IEnumerable<string>>(strings => OutputStrings(strings), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 });

            Console.WriteLine("Blocks created");

            //link the actions
            transformBlock.LinkTo(batchBlock);
            batchBlock.LinkTo(uploadFilesToAzureBlock);
            batchBlock.Completion.ContinueWith(obj => uploadFilesToAzureBlock.Complete());

            Console.WriteLine("Blocks linked");

            var testInputs = new List<string>
            {
                "Kyle",
                "Stephen",
                "Jon",
                "Conor",
                "Adrian",
                "Marty",
                "Richard",
                "Norbert",
                "Kerri",
                "Mark",
                "Declan",
                "Ray",
                "Paul",
                "Andrew",
                "Rachel",
                "David",
                "Darrell"
            };

            Console.WriteLine("Data created");

            var i = 0;
            foreach (var name in testInputs)
            {
                Console.WriteLine("Posting name {0}", i);
                transformBlock.Post(name);
                i++;
            }

            batchBlock.Complete();
            uploadFilesToAzureBlock.Completion.Wait();

            Console.WriteLine("Finishing");
            Console.ReadKey();
        }

        private static void OutputStrings(IEnumerable<string> strings)
        {
            Console.WriteLine("Beginning Batch...");

            foreach (var s in strings)
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Completing Batch...");
        }

        private static string TransformString(string input)
        {
            return input += " has been processed";
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Threading.Tasks.Dataflow;
命名空间数据流测试
{
班级计划
{
公共const int BATCH_SIZE=10;
静态void Main(字符串[]参数)
{
Console.WriteLine(“应用程序已启动”);
//创建操作管道
var transformBlock=new transformBlock(输入=>TransformString(输入),new ExecutionDataflowBlockOptions{maxdegreeofpparallelism=1});
var batchBlock=新的batchBlock(批次大小);
var uploadFilesToAzureBlock=newactionblock(strings=>OutputStrings(strings),newexecutiondataflowblockoptions{maxdegreeofpparallelism=1});
Console.WriteLine(“创建的块”);
//联系行动
transformBlock.LinkTo(批处理块);
LinkTo(将文件上传到重新锁定);
ContinueWith(obj=>uploadFilesToAzureBlock.Complete());
控制台写入线(“链接块”);
var testInputs=新列表
{
“凯尔”,
“斯蒂芬”,
“乔恩”,
“康纳”,
“阿德里安”,
“马蒂”,
“理查德”,
“诺伯特”,
“克里”,
“马克”,
“德克兰”,
“雷”,
“保罗”,
“安德鲁”,
“瑞秋”,
“大卫”,
“达雷尔”
};
Console.WriteLine(“创建的数据”);
var i=0;
foreach(testInputs中的变量名称)
{
Console.WriteLine(“发布名称{0}”,i);
邮政(名称);;
i++;
}
batchBlock.Complete();
将文件上载到zureblock.Completion.Wait();
控制台。写入线(“完成”);
Console.ReadKey();
}
私有静态void输出字符串(IEnumerable字符串)
{
Console.WriteLine(“开始批处理…”);
foreach(字符串中的变量s)
{
控制台。写入线(s);
}
Console.WriteLine(“完成批处理…”);
}
私有静态字符串转换字符串(字符串输入)
{
返回输入+=“已处理”;
}
}
}
正如上面“usr”所提到的,我没有传播块的完成。下面的代码工作得很好

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;

namespace DataflowTest
{
    class Program
    {
        public const int BATCH_SIZE = 10;
        static void Main(string[] args)
        {
            Console.WriteLine("Application started");

            //Create the pipeline of actions
            var transformBlock = new TransformBlock<string, string>(input => TransformString(input), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });
            var batchBlock = new BatchBlock<string>(BATCH_SIZE);
            var outputStringsBlock = new ActionBlock<IEnumerable<string>>(strings => OutputStrings(strings), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });

            Console.WriteLine("Blocks created");

            //link the actions
            transformBlock.LinkTo(batchBlock, new DataflowLinkOptions { PropagateCompletion = true });
            batchBlock.LinkTo(outputStringsBlock, new DataflowLinkOptions { PropagateCompletion = true });
            batchBlock.Completion.ContinueWith(obj => outputStringsBlock.Complete());

            Console.WriteLine("Blocks linked");

            var testInputs = new List<string>
            {
                "Kyle",
                "Stephen",
                "Jon",
                "Conor",
                "Adrian",
                "Marty",
                "Richard",
                "Norbert",
                "Kerri",
                "Mark",
                "Declan",
                "Ray",
                "Paul",
                "Andrew",
                "Rachel",
                "David",
                "Darrell"
            };

            Console.WriteLine("Data created");

            var i = 0;
            foreach (var name in testInputs)
            {
                Console.WriteLine("Posting name {0}", i);
                transformBlock.Post(name);
                i++;
            }

            transformBlock.Complete();
            outputStringsBlock.Completion.Wait();

            Console.WriteLine("Finishing");
            Console.ReadKey();
        }

        private static void OutputStrings(IEnumerable<string> strings)
        {
            Console.WriteLine("Beginning Batch...");
            Console.WriteLine("");

            foreach (var s in strings)
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("");
            Console.WriteLine("Completing Batch...");
        }

        private static string TransformString(string input)
        {
            return input += " has been processed";
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Threading.Tasks.Dataflow;
命名空间数据流测试
{
班级计划
{
公共const int BATCH_SIZE=10;
静态void Main(字符串[]参数)
{
Console.WriteLine(“应用程序已启动”);
//创建操作管道
var transformBlock=new transformBlock(输入=>TransformString(输入),new ExecutionDataflowBlockOptions{maxdegreeofpparallelism=2});
var batchBlock=新的batchBlock(批次大小);
var outputStringsBlock=newactionblock(strings=>OutputStrings(strings),newexecutiondataflowblockoptions{MaxDegreeOfParallelism=2});
Console.WriteLine(“创建的块”);
//联系行动
LinkTo(batchBlock,新数据流链接选项{PropagateCompletion=true});
LinkTo(outputStringsBlock,newdataflowlinkoptions{PropagateCompletion=true});
batchBlock.Completion.ContinueWith(obj=>outputStringsBlock.Complete());
控制台写入线(“链接块”);
var testInputs=新列表
{
“凯尔”,
“斯蒂芬”,
“乔恩”,
“康纳”,
“阿德里安”,
“马蒂”,
“理查德”,
“诺伯特”,
“克里”,
“马克”,
“德克兰”,
“雷”,
“保罗”,
“安德鲁”,
“瑞秋”,
“大卫”,
“达雷尔”
};
Console.WriteLine(“创建的数据”);
var i=0;
foreach(testInputs中的变量名称)
{
Console.WriteLine(“发布名称{0}”,i);
邮政(名称);;
i++;
}
transformBlock.Complete();
outputStringsBlock.Completion.Wait();
控制台。写入线(“完成”);
Console.ReadKey();
}
私有静态void输出字符串(IEnumerable字符串)
{
Console.WriteLine(“开始批处理…”);
控制台。写线(“”);
foreach(字符串中的变量s)
{
控制台。写入线(s);
}
控制台。写线(“”);
Console.WriteLine(“完成批处理…”);
}
私有静态字符串转换字符串(字符串输入)
{
返回输入+=“已处理”;
}
}
}

EDIT:我已经用一个完全可测试的控制台应用程序更新了代码,该应用程序有完全相同的问题,但是是完整的(不是一个片段)。上面的代码发布了所有的