BatchBlock
뒤에 BroadcastBlock
이 필요합니다. 그러나 완료는 귀하의 TransformBlock
중 하나로 만 전파됩니다. 일부 예 완료를 처리하기 위해 아래를 참조하십시오 : 파이프 라인은 결코 수렴하지 않는 경우
using System.Threading.Tasks.Dataflow;
namespace MyDataflow {
class MyDataflow {
public void HandlingCompletion() {
var batchBlock = new BatchBlock<int>(10);
var broadcastBlock = new BroadcastBlock<int[]>(_ => _);
var xForm1 = new TransformBlock<int[], int[]>(_ => _);
var xForm2 = new TransformBlock<int[], int[]>(_ => _);
batchBlock.LinkTo(broadcastBlock, new DataflowLinkOptions() { PropagateCompletion = true });
broadcastBlock.LinkTo(xForm1);
broadcastBlock.LinkTo(xForm1);
broadcastBlock.Completion.ContinueWith(broadcastBlockCompletionTask => {
if (!broadcastBlockCompletionTask.IsFaulted) {
xForm1.Complete();
xForm2.Complete();
}else {
((IDataflowBlock)xForm1).Fault(broadcastBlockCompletionTask.Exception);
((IDataflowBlock)xForm2).Fault(broadcastBlockCompletionTask.Exception);
}
});
xForm1.Completion.ContinueWith(async _ => {
try {
await xForm2.Completion;
//continue passing completion/fault on to rest of pipeline
} catch {
}
});
}
}
}
또한, 다시는 BroacastBlock
을 계속 한 후 각각의 파이프 라인에 대해 개별적으로 완료를 처리 할 수 있습니다. 제공된 예는 동시에 파이프 라인의 각 단계를 완료하고 동기를 따라 완료를 완료합니다. 두 번째 블록은 모든 메시지를하지 않는 이유 TPL 데이터 흐름에 연결 기본적으로