标记完成后重新打开TPL Dataflow输入

时间:2018-08-08 13:12:45

标签: c# task-parallel-library tpl-dataflow

我正在尝试提供一种处理管道服务,用户可以将其放入其中并等待结果完成处理。我的想法是使用DI使其具有注入能力。

我面临的问题是,在处理完第一组数据并将输入块标记为完成之后,当我尝试处理另一组数据时,它保持关闭状态。有没有办法重新打开管道以再次允许数据处理?

我还在TPL Dataflow的顶部使用了一个名为DataflowEx的库。

collect()

这是我目前正在使用的基本示例,用于测试此想法。

这是我希望能够使用它并能够在完成对第一组的处理之后将物品送入其中的方法。

   public interface IPipelineService
   {
        Task FillPipeline(object inputObj);

        Task WaitForResults();

        Task<List<object>> GetResults();

        Task FlushPipeline();

        Task Complete();
   }

   public class Pipeline : Dataflow<object>, IPipelineService
   {
        private TransformBlock<object, object> _inputBlock;
        private ActionBlock<object> _resultBlock;

        private List<object> _results { get; set; }

        public Pipeline() : base(DataflowOptions.Default)
        {
            _results = new List<object>();

            _inputBlock = new TransformBlock<object, object>(obj => Processing.Processing.ReceiveOrder(obj));
            _resultBlock = new ActionBlock<object>(obj => _results.Add(Processing.Processing.ReturnProcessedOrder(obj)));

            _inputBlock.LinkTo(_resultBlock, new DataflowLinkOptions() { PropagateCompletion = true });

            RegisterChild(_inputBlock);
            RegisterChild(_resultBlock);
        }

        public Task FillPipeline(object inputObj)
        {
            //InputBlock.Post(inputObj);
            return Task.CompletedTask;
        }

        public async Task WaitForResults()
        {
            await this.CompletionTask;
        }

        public Task<List<object>> GetResults()
        {
            return Task.FromResult(_results);
        }

        public Task FlushPipeline()
        {
            _results = new List<object>();
            return Task.CompletedTask;
        }

        Task IPipelineService.Complete()
        {
            InputBlock.Complete();
            return Task.CompletedTask;
        }

        public override ITargetBlock<object> InputBlock { get { return _inputBlock; } }

        public object Result { get { return _results; } }
    }

0 个答案:

没有答案