簡體   English   中英

TPL數據流,是否存在“ WaitAny”的阻止?

[英]TPL Dataflow, is there a block for “WaitAny”?

如果我正確JoinBlock<T1, T2>它, JoinBlock<T1, T2>是TPL數據流的“ WaitAll”:當您有一個T1和一個T2時,它將構建一個Tuple<T1, T2>並將其傳遞到下一個塊。

是否有數據流的“ ChoiceBlock<T1, T2> ”,“ WaitAny”,然后在其中執行Block<T1>Block<T2>

就像是:

var choice = new ChoiceBlock<string, int>
res1.LinkTo(choice.Target1);
res2.LinkTo(choice.Target2);

choice.LinkTo(intConsumer);
choice.LinkTo(stringConsumer);

編輯: 這個答案幾乎是我想要的,我只想知道當您有不同類型的使用者時是否有本機/更優雅的解決方案,並避免進行所有強制轉換和typeof(T)檢查。

EDIT2:只是為了使其更清晰:這有效

            var stringCast = new TransformBlock<object,string>(o => (string)o);
            var stringTarget = new ActionBlock<string>(m_printAction);
            stringCast.LinkTo(stringTarget);

            var eventCast = new TransformBlock<object, Event>(o => (Event)o);
            var eventTarget = new ActionBlock<Event>(m_addEventAction);
            eventCast.LinkTo(eventTarget);

            var forwarder = new BufferBlock<object>();
            forwarder.LinkTo(stringCast, item => item is string);
            forwarder.LinkTo(eventCast, item => item is Event);

            forwarder.LinkTo(DataflowBlock.NullTarget<object>());

            m_messages.LinkTo(forwarder);
            m_events.LinkTo(forwarder);

但這是丑陋且效率低下的。 有沒有更適合的東西?

舊的CCR(並發和協調運行時)曾經同時具有Join和Choice,但在TPL Dataflow中找不到Choice。 我想念什么嗎?

除了對Dataflowblock.Choose一些創造性的使用之外,請選擇MSDN

您的示例中確實沒有任何選擇:

var choice = new ChoiceBlock<string, int>
res1.LinkTo(choice.Target1);
res2.LinkTo(choice.Target2);

choice.LinkTo(intConsumer);
choice.LinkTo(stringConsumer);

前一個塊將不必知道它將輸出什么類型,從而導致丑陋的對象類型參數,否則您將不必要地將兩個塊鏈接為一個。 假設后者有兩個不同的類型化管道怎么了?

var buffer1 = new BufferBlock<int>();
var buffer2 = new BufferBlock<string>();
var transform1 = new TransformBlock<int, int>((x) => x);
var transform2 = new TransformBlock<string, string>((x) => x);
buffer1.LinkTo(transform1);
buffer2.LinkTo(transform2);

是否有數據流的“ ChoiceBlock”,“ WaitAny”,然后在其中執行Block<T1>Block<T2>

在任何時候,如果輸出在任一源(即緩沖區)處變為可用,則可將其提供給Block<int>Block<string> 這不會以類型化的方式填充WaitAny隱含合同嗎?

不一定是OP問題的答案,但評論太久。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM