//private ConcurrentBag<bool> results; public SimpleActionBlock(BlockingCollection <WorkItem> inputQueue) { var opts = new ExecutionDataflowBlockOptions { TaskScheduler = TaskScheduler.Current, MaxDegreeOfParallelism = 2 }; _queue1 = new ActionBlock <WorkItem>(job => job.Execute(Thread.CurrentThread.ManagedThreadId), opts); _queue2 = new ActionBlock <WorkItem>(job => job.Execute(Thread.CurrentThread.ManagedThreadId), opts); _buffer.LinkTo(_queue1, new DataflowLinkOptions() { PropagateCompletion = true }); _buffer.LinkTo(_queue1); _buffer.LinkTo(_queue2); Task.Run(async() => { foreach (var job in inputQueue.GetConsumingEnumerable()) { if (job.Assigne.StartsWith("a")) { _buffer.Post(job, Priority.Medium); } if (job.Assigne.StartsWith("q")) { _buffer.Post(job, Priority.Medium); } if (job.Assigne.StartsWith("z")) { _buffer.Post(job, Priority.High); } else { _buffer.Post(job, Priority.Low); } } }); }
//private ConcurrentBag<bool> results; public SimpleActionBlockPriority(BlockingCollection <WorkItem> inputQueue) { InputQueue = inputQueue; var opts = new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 2, BoundedCapacity = 2 }; _buffer = new PriorityBufferBlock <WorkItem>(); _queue1 = new ActionPriorityBlock <WorkItem>(job => job.Execute(Thread.CurrentThread.ManagedThreadId + 100), opts); _queue2 = new ActionPriorityBlock <WorkItem>(job => job.Execute(Thread.CurrentThread.ManagedThreadId + 200), opts); //var linkOptions = new DataflowLinkOptions(){PropagateCompletion = true}; _buffer.LinkTo(_queue1.HightPriorityTarget, (job) => job.Assigne.StartsWith("q")); _buffer.LinkTo(_queue1.LowPriorityTarget, (job) => !job.Assigne.StartsWith("q")); _buffer.LinkTo(_queue2.HightPriorityTarget, (job) => job.Assigne.StartsWith("a")); _buffer.LinkTo(_queue2.LowPriorityTarget, (job) => !job.Assigne.StartsWith("a")); }