TPL数据流-事件流的用法

时间:2019-06-17 10:34:37

标签: c# producer-consumer dataflow tpl-dataflow

在我的应用程序中,几乎每次都有大量来自第三方的事件,我必须处理它们并将其发送(通过网络)发送(发布)到组织的RabbitMQ。我的疑问是关于TPL Dataflow中的用法。假设代码如下:

 private TransformBlock<QuoteEvent, Quote> _quotesProcessingBlock;

    private ActionBlock<Quote> _deliveryBlock;
    public TplDataFlow()
    {
        _quotesProcessingBlock = new TransformBlock<QuoteEvent, Quote>(
            x => ProcessQuoteEvent(x));
        _deliveryBlock = new ActionBlock<Quote>(quote => Publish(quote));

        _quotesProcessingBlock.LinkTo(
            _deliveryBlock,
             new DataflowLinkOptions { PropagateCompletion = true }
            ); 
    }

    //This callback method registered at the 3rd party events producer.
//It runs single threaded, so I need to process it quickly  
    private void ProcessEvent(QuoteEvent quoteEvent)
    {
        _quotesProcessingBlock.Post(quoteEvent);

        //What will be the trigger for those lines?? 
        _quotesProcessingBlock.Complete();
        _deliveryBlock.Completion.ConfigureAwait(false).GetAwaiter().GetResult();
    }

我不确定何时使用_quotesProcessingBlock.Complete();_deliveryBlock.Completion。在我看来,对于每个报价事件(每秒几百次)这样做都是不合理的,

  

如果是这样,我应该将其删除还是将其移至其他级别?

或者

  

这里的数据流不是正确的解决方案吗?

     

如果是这样,有替代解决方案吗?

1 个答案:

答案 0 :(得分:1)

在完成该数据流块后,您将调用Complete。在这种情况下,没有更多事件可处理。在您的应用程序关闭时,您只能执行一次此操作,或者根本不执行操作。

即使您从不致电await,也应该在某个时候Completion Complete属性;如果数据流网格失败,它将通知您的代码。