コード例 #1
0
        //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);
                    }
                }
            });
        }
コード例 #2
0
        //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"));
        }