Поток данных TPL - использование с потоком событий - PullRequest
1 голос
/ 17 июня 2019

В моем приложении у меня есть тонны событий, поступающих от третьих лиц почти каждый раз, я должен обработать их и отправить (опубликовать) их по сети на RabbitMQ организации,Мои сомнения касаются использования здесь в потоке данных TPL.представьте, что код такой:

 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 Ответ

1 голос
/ 17 июня 2019

Вы бы позвонили Complete, когда закончите с этим блоком потока данных. В этом случае, когда больше нет событий для обработки. Вполне возможно, что вы можете сделать это только один раз, когда ваше приложение закрывается, или, может быть, не совсем.

Вы должны await свойство Completion в какой-то момент, даже если вы никогда не вызываете Complete; это сообщит ваш код, если меш потока данных потерпит неудачу.

...