C# TPL数据流-块未按预期处理

C# TPL数据流-块未按预期处理,c#,.net,task-parallel-library,tpl-dataflow,C#,.net,Task Parallel Library,Tpl Dataflow,我有一组简单的块,它们大部分是以串行方式处理的,但我有两个块,我想并行处理(processblock1和processblock2)。我刚开始玩TPL数据块,对它来说太陌生了。 然而,在下面的代码中,我可以看到parallelblock1被当作parallelblock2调用,但从来没有像预期的那样调用。我希望他们能同时被踢出去 class Program { static void Main(string[] args) {

我有一组简单的块,它们大部分是以串行方式处理的,但我有两个块,我想并行处理(processblock1和processblock2)。我刚开始玩TPL数据块,对它来说太陌生了。 然而,在下面的代码中,我可以看到parallelblock1被当作parallelblock2调用,但从来没有像预期的那样调用。我希望他们能同时被踢出去

    class Program
    {
        static void Main(string[] args)
        {
            var readBlock = new TransformBlock<int, int>(x => DoSomething(x, "readBlock"),
                new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 }); //1

            var processBlock1 =
                new TransformBlock<int, int>(x => DoSomething(x, "processBlock1")); //2
            var processBlock2 =
                new TransformBlock<int, int>(x => DoSomething(x, "processBlock2")); //3

            var saveBlock =
                new ActionBlock<int>(
                x => Save(x)); //4

            readBlock.LinkTo(processBlock1,
                new DataflowLinkOptions { PropagateCompletion = true }); //5

            readBlock.LinkTo(processBlock2,
                new DataflowLinkOptions { PropagateCompletion = true }); //6


            processBlock1.LinkTo(
                saveBlock); //7

            processBlock2.LinkTo(
                saveBlock); //8

            readBlock.Post(1); //10

            Task.WhenAll(
                processBlock1.Completion,
                processBlock2.Completion)
                .ContinueWith(_ => saveBlock.Complete()); //11

            readBlock.Complete(); //12
            saveBlock.Completion.Wait(); //13
            Console.WriteLine("Processing complete!");
            Console.ReadLine();
        }
        private static int DoSomething(int i, string method)
        {
            Console.WriteLine($"Do Something, callng method : { method}");
            return i;
        }
        private static async Task<int> DoSomethingAsync(int i, string method)
        {
            DoSomething(i, method);
            return i;
        }
        private static void Save(int i)
        {
            Console.WriteLine("Save!");
        }


    }
类程序
{
静态void Main(字符串[]参数)
{
var readBlock=新转换块(x=>DoSomething(x,“readBlock”),
新的ExecutionDataflowBlockOptions{MaxDegreeOfParallelism=1});//1
var进程块1=
新的TransformBlock(x=>DoSomething(x,“processBlock1”);//2
var进程块2=
新的TransformBlock(x=>DoSomething(x,“processBlock2”);//3
var存储块=
新动作块(
x=>保存(x));//4
readBlock.LinkTo(进程块1,
新的DataflowLinkOptions{PropagateCompletion=true});//5
readBlock.LinkTo(进程块2,
新数据流链接选项{PropagateCompletion=true});//6
processBlock1.LinkTo(
saveBlock);//7
processBlock2.LinkTo(
saveBlock);//8
readBlock.Post(1);//10
任务WhenAll(
进程块1.完成,
进程块(2.完成)
.ContinueWith(=>saveBlock.Complete());//11
readBlock.Complete();//12
saveBlock.Completion.Wait();//13
Console.WriteLine(“处理完成!”);
Console.ReadLine();
}
私有静态int DoSomething(int i,string方法)
{
WriteLine($“做点什么,调用方法:{method}”);
返回i;
}
私有静态异步任务DoSomethingAsync(inti,string方法)
{
剂量测定法(i,方法);
返回i;
}
私有静态无效保存(int i)
{
控制台。WriteLine(“保存!”);
}
}

默认情况下,tpl块将只向第一个链接块发送消息。 使用向多个组件发送消息

void Main()
{
    var random = new Random();
    var readBlock = new TransformBlock<int, int>(x => {  return DoSomething(x, "readBlock"); },
            new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 }); //1

    var braodcastBlock = new BroadcastBlock<int>(i => i); // ⬅️ Here

    var processBlock1 =
        new TransformBlock<int, int>(x => DoSomething(x, "processBlock1")); //2
    var processBlock2 =
        new TransformBlock<int, int>(x => DoSomething(x, "processBlock2")); //3

    var saveBlock =
        new ActionBlock<int>(
        x => Save(x)); //4

    readBlock.LinkTo(braodcastBlock, new DataflowLinkOptions { PropagateCompletion = true });

    braodcastBlock.LinkTo(processBlock1,
        new DataflowLinkOptions { PropagateCompletion = true }); //5

    braodcastBlock.LinkTo(processBlock2,
        new DataflowLinkOptions { PropagateCompletion = true }); //6


    processBlock1.LinkTo(
        saveBlock); //7

    processBlock2.LinkTo(
        saveBlock); //8

    readBlock.Post(1); //10
    readBlock.Post(2); //10

    Task.WhenAll(
                processBlock1.Completion,
                processBlock2.Completion)
                .ContinueWith(_ => saveBlock.Complete());

    readBlock.Complete(); //12
    saveBlock.Completion.Wait(); //13
    Console.WriteLine("Processing complete!");
}

// Define other methods and classes here

private static int DoSomething(int i, string method)
{
    Console.WriteLine($"Do Something, callng method : { method} {i}");
    return i;
}
private static Task<int> DoSomethingAsync(int i, string method)
{
    DoSomething(i, method);
    return Task.FromResult(i);
}
private static void Save(int i)
{
    Console.WriteLine("Save! " + i);
}
void Main()
{
var random=新的random();
var readBlock=newtransformblock(x=>{return DoSomething(x,“readBlock”);},
新的ExecutionDataflowBlockOptions{MaxDegreeOfParallelism=1});//1
var braodcastBlock=新广播块(i=>i);//⬅️ 在这里
var进程块1=
新的TransformBlock(x=>DoSomething(x,“processBlock1”);//2
var进程块2=
新的TransformBlock(x=>DoSomething(x,“processBlock2”);//3
var存储块=
新动作块(
x=>保存(x));//4
LinkTo(braodcastBlock,新的DataflowLinkOptions{PropagateCompletion=true});
braodcastBlock.LinkTo(进程块1,
新的DataflowLinkOptions{PropagateCompletion=true});//5
braodcastBlock.LinkTo(进程块2,
新数据流链接选项{PropagateCompletion=true});//6
processBlock1.LinkTo(
saveBlock);//7
processBlock2.LinkTo(
saveBlock);//8
readBlock.Post(1);//10
readBlock.Post(2);//10
任务WhenAll(
进程块1.完成,
进程块(2.完成)
.ContinueWith(=>saveBlock.Complete());
readBlock.Complete();//12
saveBlock.Completion.Wait();//13
Console.WriteLine(“处理完成!”);
}
//在此处定义其他方法和类
私有静态int DoSomething(int i,string方法)
{
WriteLine($“做点什么,调用方法:{method}{i}”);
返回i;
}
私有静态任务DoSomethingAsync(int i,字符串方法)
{
剂量测定法(i,方法);
返回任务.FromResult(i);
}
私有静态无效保存(int i)
{
Console.WriteLine(“Save!”+i);
}

默认情况下,tpl块将只向第一个链接块发送消息。 使用向多个组件发送消息

void Main()
{
    var random = new Random();
    var readBlock = new TransformBlock<int, int>(x => {  return DoSomething(x, "readBlock"); },
            new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 }); //1

    var braodcastBlock = new BroadcastBlock<int>(i => i); // ⬅️ Here

    var processBlock1 =
        new TransformBlock<int, int>(x => DoSomething(x, "processBlock1")); //2
    var processBlock2 =
        new TransformBlock<int, int>(x => DoSomething(x, "processBlock2")); //3

    var saveBlock =
        new ActionBlock<int>(
        x => Save(x)); //4

    readBlock.LinkTo(braodcastBlock, new DataflowLinkOptions { PropagateCompletion = true });

    braodcastBlock.LinkTo(processBlock1,
        new DataflowLinkOptions { PropagateCompletion = true }); //5

    braodcastBlock.LinkTo(processBlock2,
        new DataflowLinkOptions { PropagateCompletion = true }); //6


    processBlock1.LinkTo(
        saveBlock); //7

    processBlock2.LinkTo(
        saveBlock); //8

    readBlock.Post(1); //10
    readBlock.Post(2); //10

    Task.WhenAll(
                processBlock1.Completion,
                processBlock2.Completion)
                .ContinueWith(_ => saveBlock.Complete());

    readBlock.Complete(); //12
    saveBlock.Completion.Wait(); //13
    Console.WriteLine("Processing complete!");
}

// Define other methods and classes here

private static int DoSomething(int i, string method)
{
    Console.WriteLine($"Do Something, callng method : { method} {i}");
    return i;
}
private static Task<int> DoSomethingAsync(int i, string method)
{
    DoSomething(i, method);
    return Task.FromResult(i);
}
private static void Save(int i)
{
    Console.WriteLine("Save! " + i);
}
void Main()
{
var random=新的random();
var readBlock=newtransformblock(x=>{return DoSomething(x,“readBlock”);},
新的ExecutionDataflowBlockOptions{MaxDegreeOfParallelism=1});//1
var braodcastBlock=新广播块(i=>i);//⬅️ 在这里
var进程块1=
新的TransformBlock(x=>DoSomething(x,“processBlock1”);//2
var进程块2=
新的TransformBlock(x=>DoSomething(x,“processBlock2”);//3
var存储块=
新动作块(
x=>保存(x));//4
LinkTo(braodcastBlock,新的DataflowLinkOptions{PropagateCompletion=true});
braodcastBlock.LinkTo(进程块1,
新的DataflowLinkOptions{PropagateCompletion=true});//5
braodcastBlock.LinkTo(进程块2,
新数据流链接选项{PropagateCompletion=true});//6
processBlock1.LinkTo(
saveBlock);//7
processBlock2.LinkTo(
saveBlock);//8
readBlock.Post(1);//10
readBlock.Post(2);//10
任务WhenAll(
进程块1.完成,
进程块(2.完成)
.ContinueWith(=>saveBlock.Complete());
readBlock.Complete();//12
saveBlock.Completion.Wait();//13
Console.WriteLine(“处理完成!”);
}
//在此处定义其他方法和类
私有静态int DoSomething(int i,string方法)
{
WriteLine($“做点什么,调用方法:{method}{i}”);
返回i;
}
私有静态任务DoSomethingAsync(int i,字符串方法)
{
剂量测定法(i,方法);
返回任务.FromResult(i);
}
私有静态无效保存(int i)
{
Console.WriteLine(“Save!”+i);
}

您似乎只将一个项目发布到图表中,第一个消费该项目的消费者获胜。在您所看到的图形中没有隐含的“tee”功能