TPL 데이터 흐름에 대한 완벽한 시나리오 인 필요가있는 프로젝트를 진행 중입니다. 상대적으로 제한된 경험 (그리고 내가했던 일은 얼마 전에 끝난 것입니다.)을 가졌으므로 필자는 온라인에서 찾을 수있는 기사뿐만 아니라 Microsoft의 설명서를 읽음으로써 그것을 닦아 왔습니다. 내가 찾을 수있는 (기사에서TPL 데이터 흐름, 블록 및 계속 작업 이해
var block1 = new TransformBlock<T, U>(async input => {});
var block2 = new TransformBlock<U, V>(async input => {});
var block3 = new ActionBlock<V>(async input => {});
block1.LinkTo(block2);
block2.LinkTo(block3);
foreach(var item in items)
{
await block1.SendAsync(item);
}
block1.Complete();
await block3.Completion;
사람 :
그 일을하는 데, 나는 함께 체인 블록 (대부분TransformBlock
이 같은 하 고의
ActionBlock
로 끝나는 일련의 내 코드를 내장) 완료로 블록을 표시하는 파이프 라인의 연속 작업이되어야한다고 제안했다. 이것은 그들이 그것을 위해 제공되는 코드입니다.
// Create the continuation tasks in the pipeline that marks each block as complete.
await block1.Completion.ContinueWith(t =>
{
if (t.IsFaulted) { ((IDataflowBlock)block2).Fault(t.Exception); }
else { block2.Complete(); }
});
await block2.Completion.ContinueWith(t =>
{
if (t.IsFaulted) { ((IDataflowBlock)block3).Fault(t.Exception); }
else { block3.Complete(); }
});
을 나는 완전히이 코드는 일을하고 있는지 무엇을 이해하지 않는다는 것을 인정합니다 그것은 심지어 필요합니다. 방금 작성한 코드에서이 코드를 실행하려고하면 코드가 처음으로 ContinueWith
에 멈추고 파이프 라인을 실행하지 않습니다.
여기에서 무슨 일이 일어나고 있는지에 대한 뉘앙스를 더 잘 이해하고 싶기 때문에 추가 설명을 부탁드립니다.
질문마다 여러 개의 개별 질문을하지 않아야합니다. 또한 일부 개념 전체를 설명하는 것은 너무 광범위합니다. * 단일, 특정 * 질문을해야합니다. – Servy
@Servy 첫 번째 질문을 삭제했습니다. 두 번째 부분을 어떻게 묻는가? 나는 누군가가 왜 중요하다고 말했는지 이해하지 못하는 코드를 제공했다. 이 시점에서, 나는 그것을 더 잘 이해하는 데 도움이되는 것을 발견하거나 읽지 못했습니다. – JasCav
블록 완료의 작동 방식에 대한 * 아무것도 *를 찾지 못했고 경쟁 방식에 대한 모든 뉘앙스를 설명 할 사람이 필요합니까? 첫 번째 부분에는 블록 완성이 어떻게 작동하는지에 대한 정보가 많이 있습니다. 두 번째로는 너무 광범위합니다. – Servy