[英]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.