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();
, 어떤 아이디어?
감사합니다. Transform 블록을 여러 대상에 직접 연결할 수 없으므로 Broadcast 블록을 중개자로 사용해야합니다. 나는 그것을 놓쳤을 지 모르지만 이것을 암시하는 문서를 보지 못했습니다. –
@AmitG 일부 블록은 여러 대상에 연결될 수 있지만 모든 대상에 항목을 "복사"하지는 않습니다. 모든 항목에 대해 단일 대상에만 게시됩니다. BroadcastBlock은 항목이 변경 될 때까지 모든 대상에게 항목을 제공합니다. – i3arnon
'BroadcastBlock'은 모든 타겟 블록에 ** 최신 ** 값만을 제공한다는 것을 이해합니다. 이것은이 예제에서'TransformBlock'이 새로운 값을 가지면,'ActionBlocks'는 모든 값을받지 못한다는 것을 의미합니다 - 특히'TransformBlock'이 생성하는 것보다 더 오래 걸리는 경우. – urbanhusky