数据流(TPL):如何随机处理连续数据

时间:2017-10-17 13:41:05

标签: c# tpl-dataflow

鉴于

  • 此代码代表一些模块/服务
  • 模块每次都会收到一组项目并开始处理
  • 模块应该等待以前的组完成以开始处理新组(仅限CPU限制)

以下代码的输出为:000000000011111111112222222222

热门更改代码以生成下一个输出:012012012012012012012012012012

    var executionDataflowBlockOptions =
        new ExecutionDataflowBlockOptions() { 
            MaxDegreeOfParallelism = 3, EnsureOrdered = false, BoundedCapacity = 30 };

    var testData =
        Enumerable
            .Range(0, 3)
            .Select(o => Enumerable.Repeat(o, 10));

    var inputBlock =
        new TransformManyBlock<IEnumerable<int>, int>(
            collectionOfItems => collectionOfItems, 
            executionDataflowBlockOptions);

    var processBlock =
        new ActionBlock<int>(
            number =>
            {
                Thread.Sleep(100);
                Console.Write(number);
            }, 
            executionDataflowBlockOptions );

    inputBlock
        .LinkTo(processBlock);

    foreach (var item in testData)
    {
        await inputBlock.SendAsync(item);
    }

更新(EnsureOrdered)

终于找到了这个选项(感谢JSteward)。我用了 Microsoft.Tpl.Dataflow (看起来已过时)而不是 System.Threading.Tasks.Dataflow 。不知道为什么nuget搜索会让他们陷入如此奇怪的秩序。

无论如何添加此选项会更改结果。有时它输出000000000022222222221111111111(更改订单组),更改BoundedCapacity = 30某时输出这样的结果:210202222222020000000111111111或201012222222212111111001000000,这要好得多,但结果仍然可以更随机

0 个答案:

没有答案