2014-04-25 2 views
11

가 나는 두 출판사에서 출력을 생성하려면 다음을 기대하지만, 그것은 단지 첫 번째 출력 생성 : 나는 분명히 여기에 근본적인 뭔가를 누락TPL 데이터 흐름에서 여러 대상 블록을 소스 블록과 어떻게 연결합니까?

var broadcastBlock = new BroadcastBlock<int>(null); 
var transformBlock = new TransformBlock<int, int>(i => i*10); 
var publish1 = new ActionBlock<int>(i => Console.WriteLine("Publisher 1:" + i)); 
var publish2 = new ActionBlock<int>(i => Console.WriteLine("Publisher 2:" + i)); 

broadcastBlock.LinkTo(transformBlock, new DataflowLinkOptions() { PropagateCompletion = true }); 
transformBlock.LinkTo(publish1, new DataflowLinkOptions() { PropagateCompletion = true }); 
transformBlock.LinkTo(publish2, new DataflowLinkOptions() { PropagateCompletion = true }); 

foreach (var i in Enumerable.Range(0, 5)) 
{ 
    broadcastBlock.Post(i); 
} 
broadcastBlock.Complete(); 
Task.WhenAll(publish1.Completion, publish2.Completion).Wait(); 

, 어떤 아이디어?

답변

13

TransformBlock에 2 ActionBlock을 연결하고 있습니다. 2 ActionBlockBrodcastBlock에 연결하고 BroadcastBlockTransformBlock에 연결해야합니다.

당신이 무엇 :

BroadCast => Transfrom => ActionBlock 
         => ActionBlock 

당신이 필요로하는 무엇을 : 답장을

Transfrom => BroadCast => ActionBlock 
         => ActionBlock 
+0

감사합니다. Transform 블록을 여러 대상에 직접 연결할 수 없으므로 Broadcast 블록을 중개자로 사용해야합니다. 나는 그것을 놓쳤을 지 모르지만 이것을 암시하는 문서를 보지 못했습니다. –

+3

@AmitG 일부 블록은 여러 대상에 연결될 수 있지만 모든 대상에 항목을 "복사"하지는 않습니다. 모든 항목에 대해 단일 대상에만 게시됩니다. BroadcastBlock은 항목이 변경 될 때까지 모든 대상에게 항목을 제공합니다. – i3arnon

+3

'BroadcastBlock'은 모든 타겟 블록에 ** 최신 ** 값만을 제공한다는 것을 이해합니다. 이것은이 예제에서'TransformBlock'이 새로운 값을 가지면,'ActionBlocks'는 모든 값을받지 못한다는 것을 의미합니다 - 특히'TransformBlock'이 생성하는 것보다 더 오래 걸리는 경우. – urbanhusky

관련 문제