gpt4 book ai didi

c# - fork TPL 数据流管道时如何正确等待完成?

转载 作者:行者123 更新时间:2023-12-05 04:26:42 25 4
gpt4 key购买 nike

<分区>

我有一个 TPL 数据流管道,其中一个目标 block 链接到两个传播 block ,然后它们都链接到一个源 block 。所有都与 PropagateCompletion = true 链接。第一个传播 block 与仅接受偶数的过滤器链接,其中第二个传播 block 接受所有剩余消息。

发布最后一条消息后,我将第一个 block 设置为已完成。虽然似乎存在竞争条件。最终 block 有时似乎处理所有值,但有时只处理第一个传播 block 接受的值,而第二个传播 block 只接受部分值。

我觉得存在竞争条件。但是我不知道如何正确地指示最终源 block 一切都已完成,只有在链接到它的两个传播 block 都转发了它们的所有消息之后。

这是我的代码简化成一个简单的例子:

    internal static class Program
{
public static async Task Main(string[] args)
{
var linkOptions = new DataflowLinkOptions
{
PropagateCompletion = true
};
var bufferBlock = new BufferBlock<int>();
var fork1 = new TransformBlock<int, int>(n => n);
var fork2 = new TransformBlock<int, int>(n =>
{
Thread.Sleep(100);
return n;
});
var printBlock = new ActionBlock<int>(Console.WriteLine);

bufferBlock.LinkTo(fork1, linkOptions, n => n % 2 == 0);
bufferBlock.LinkTo(fork2, linkOptions, n => n % 2 != 0);

fork1.LinkTo(printBlock, linkOptions);
fork2.LinkTo(printBlock, linkOptions);

for (var n = 1; n <= 10; ++n)
{
bufferBlock.Post(n);
}
bufferBlock.Complete();

await printBlock.Completion;
}
}

这个输出:

2
4
6
8
10

我希望它输出:

2
4
6
8
10
1
3
5
7
9

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com