Skip to content

Instantly share code, notes, and snippets.

@AlgorithmsAreCool
Created December 29, 2019 23:03
Show Gist options
  • Save AlgorithmsAreCool/fe01df36be764bf444238072fb29a351 to your computer and use it in GitHub Desktop.
Save AlgorithmsAreCool/fe01df36be764bf444238072fb29a351 to your computer and use it in GitHub Desktop.
Repro program
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
namespace randomTPLRepro
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Hello World!");
await Buffer();
}
private static async Task BufferBroadcast()
{
var ab1Count = 0;
var ab2Count = 0;
var edbo = new ExecutionDataflowBlockOptions();
var buffer = new BufferBlock<int>();
var broadcast = new BroadcastBlock<int>(x => x);
var lo = new DataflowLinkOptions { PropagateCompletion = true };
var tb1 = new TransformBlock<int, string>(x => x.ToString(), edbo);
var ab1 = new ActionBlock<string>(x => Interlocked.Increment(ref ab1Count), edbo);
var tb2 = new TransformBlock<int, string>(x => x.ToString(), edbo);
var ab2 = new ActionBlock<string>(x => Interlocked.Increment(ref ab2Count), edbo);
var link0 = buffer.LinkTo(broadcast, lo);
var link1 = broadcast.LinkTo(tb1, lo);
var link2 = tb1.LinkTo(ab1, lo);
var link3 = broadcast.LinkTo(tb2, lo);
var link4 = tb2.LinkTo(ab2, lo);
for (var i = 0; i < 10; ++i)
{
if (!await buffer.SendAsync(i))
throw new Exception("Send Failed");
}
buffer.Complete();
await ab1.Completion;
await ab2.Completion;
Console.WriteLine($"Count 1 = {ab1Count}");
Console.WriteLine($"Count 2 = {ab2Count}");
}
private static async Task Buffer()
{
var ab1Count = 0;
var ab2Count = 0;
var bb = new BufferBlock<int>();
var lo = new DataflowLinkOptions { PropagateCompletion = true };
var edbo = new ExecutionDataflowBlockOptions();
//edbo.BoundedCapacity = 5;
var tb1 = new TransformBlock<int, string>(x => x.ToString(), edbo);
var ab1 = new ActionBlock<string>(x => Interlocked.Increment(ref ab1Count), edbo);
var tb2 = new TransformBlock<int, string>(x => x.ToString(), edbo);
var ab2 = new ActionBlock<string>(x => Interlocked.Increment(ref ab2Count), edbo);
var link1 = bb.LinkTo(tb1, lo);
var link2 = tb1.LinkTo(ab1, lo);
var link3 = bb.LinkTo(tb2, lo);
var link4 = tb2.LinkTo(ab2, lo);
for (var i = 0; i < 10; ++i)
{
if (!await bb.SendAsync(i))
throw new Exception("Send Failed");
}
bb.Complete();
await ab1.Completion;
await ab2.Completion;
Console.WriteLine($"Count 1 = {ab1Count}");
Console.WriteLine($"Count 2 = {ab2Count}");
}
}
}
@AlgorithmsAreCool
Copy link
Author

Output from Buffer:

Hello World!
Count 1 = 5
Count 2 = 5

Output from BufferBroadcast:

Hello World!
Count 1 = 10
Count 2 = 10

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment