2013-12-11 5 views
1

TPL DataFlow부터 시작하겠습니다. 다음 작업 코드가 생성되었습니다. 링크 된 블록이 완료되지 않습니다.

public async void ReadItems(ITargetBlock<SourceCodeFile> target) 
{ 
    foreach(var item in Source) 
    { 
     await target.SendAsync(item); //when To use post instead of sendasync? 
    } 
} 

target.Complete(); 

지금 나는 BufferBlock (readFilesBlock를) cosume이 잘 작동이

while (await readFilesBlock.OutputAvailableAsync()) 
    { 
     var file = await readFilesBlock.ReceiveAsync(); 

     ActionBlock<SourceCodeFile> action = new ActionBlock<SourceCodeFile>(item => storeResultsInBag(resultBag, item)); 
     await action.SendAsync(file); 
    } 

같은 다음 readFilesBlock는 BufferBlock 그것은 다음과 같이 작성된다. 는 이제 링크 기능

내가 시도 사용할 :

var storeFilesInBagAction = new ActionBlock<SourceCodeFile>(item => storeResultsInBag(resultBag, item)); 

readFilesBlock.LinkTo(storeFilesInBagAction); 

await storeFilesInBagAction.Completion; 

을하지만 이번에는 내가 완료를 못할거야.

내가 뭘 잘못하고 있니?

Bagaction의 저장소 파일을 기다리지 않고 항목을 반환하지 않았습니다.

+1

1. '비동기 무효화'를 피하십시오. 2. 각 파일에 대해 새로운'ActionBlock'을 생성 할 필요는 없습니다. – svick

답변

5

기본적으로 데이터 흐름 블록은 완료를 전파하지 않습니다. 이는 의도적으로 설계된 동작입니다. 데이터 흐름은 분할, 조인 및 루프 (파이프 라인뿐만 아니라)를 포함한 모든 종류의 메시를 나타낼 수 있습니다.

PropagateCompletion option이 완료되면 연결될 때 설정할 수 있습니다.

readFilesBlock.LinkTo(storeFilesInBagAction, new DataflowLinkOptions 
{ 
    PropagateCompletion = true, 
}); 
+0

고마워. Btw이 주제에 대한 좋은 웹 캐스트/튜토리얼에 대한 힌트를 줄 수 있습니까? –

+1

제가 아는 훌륭한 튜토리얼은 없습니다. 나는 [내 블로그에 세 부분으로 소개] (http://blog.stephencleary.com/search/label/Dataflow)했지만 완벽한 것은 아니 었습니다. 좀 더 심층적 인 튜토리얼은 [TPL Dataflow에 대한 최초의 소개] (http://www.microsoft.com/en-us/download/details.aspx?id=14782) 문서입니다. –