Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Threading.Tasks.Dataflow;
- using NLog;
- namespace Starter
- {
- internal class StackoverFlowTest
- {
- private static readonly Logger Log = LogManager.GetCurrentClassLogger();
- private TransformBlock<Data, Tuple<Data, MetaData>> _ioBlock;
- private TransformBlock<Tuple<Data, MetaData>, Data> _waitBlock;
- private static readonly SecureRandom Random = new SecureRandom();
- public void Start()
- {
- _ioBlock = new TransformBlock<Data, Tuple<Data, MetaData>>(async data =>
- {
- Log.Debug($"Enter I/O block {data.I}...");
- var metaData = await ReadAsync(data).ConfigureAwait(false);
- var dataMetaData = new Tuple<Data, MetaData>(data, metaData);
- Log.Debug($"Exit I/O block {data.I}...");
- return dataMetaData;
- }, new ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = 100});
- _waitBlock = new TransformBlock<Tuple<Data, MetaData>, Data>(async dataMetaData =>
- {
- Log.Debug($"Enter wait block {dataMetaData.Item1.I}...");
- var data = dataMetaData.Item1;
- var metaData = dataMetaData.Item2;
- if (!metaData.Repost)
- {
- return null;
- }
- await Task.Delay(TimeSpan.FromMinutes(1)).ConfigureAwait(false);
- Log.Debug($"Exit wait block {data.I}...");
- return data;
- }, new ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded});
- _ioBlock.LinkTo(_waitBlock);
- _waitBlock.LinkTo(_ioBlock, data => data != null);
- _waitBlock.LinkTo(DataflowBlock.NullTarget<Data>());
- foreach (var data in Enumerable.Range(0, 10000).Select(i => new Data(i)))
- {
- _ioBlock.Post(data);
- }
- }
- private static async Task<MetaData> ReadAsync(Data data)
- {
- var milliseconds = Random.Next(1, 56789);
- await Task.Delay(milliseconds).ConfigureAwait(false);// Some I/O using 'data'...
- var repost = Random.Next(0, 10) < 3;// Some fake result of I/O task
- return new MetaData {Repost = repost};
- }
- }
- internal class MetaData
- {
- public bool Repost { get; set; }
- }
- internal class Data
- {
- public int I { get; }
- public Data(int i)
- {
- I = i;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement