2017-04-26 1 views
1

BufferBlock에 2의 제한된 용량이 있고 이것을 (LinkTo()을 사용하여) MaxBegreeOfParallelism = 2 인 ActionBlock과 링크한다고 가정 해 봅시다. 이제 바로 2 개의 항목을 버퍼에 보낼 수 있고 ActionBlock은 즉시 처리를 시작하십시오. 하지만 작업을 완료하는 데 몇 초가 걸린다고 가정 해 보겠습니다. 버퍼에 2 개의 항목을 추가로 보낼 수 있습니까? 작업을 처음 실행하는 사람 또는 버퍼를 소비하는 작업이 완료된 후 버퍼에서만 제거되는 항목입니까?ActionBlock이 시작되거나 끝날 때 항목이 BufferBlock에서 제거됩니까?

답변

1

ActionBlock의 바인드되지 않은 용량이 BufferBlock의 제한된 용량과 상관없는 경우 ActionBlock은 메모리가 부족할 때까지 모든 항목을 버퍼링합니다. 그러나 ActionBlockBoundedCapcity을 2로 설정하고 MaxDegreeParallelism을 2로 설정하면 두 개의 메시지를 처리하고 두 개의 메시지를 버퍼에 보관합니다. 그런 다음 버퍼 블록은 2 개의 추가 메시지를 버퍼링합니다. 추가 메시지는 파이프 라인에서 용량을 기다려야합니다. 공간을 확보 할 때까지 기다리는 가장 좋은 방법은 await myPipeline.SendAsync(data)입니다. 합계로 전체 파이프 라인에 대해 6의 용량을 갖습니다.

+0

감사합니다. JSteward. 액션 블록 (ActionBlock)이 버퍼링을하고 있다는 것을 깨닫지 못했습니다. 필자가 실제로 원하는 것은 병렬로 실행되는 프로세스가 2 개뿐이지만 추가 작업을 버퍼 할 필요가 없다는 것입니다. 따라서 SendAsync를 두 번 호출하면 첫 번째 호출이 완료 될 때까지 세 번째 호출을 기다려야합니다. 그게 가능하니? – PICyourBrain

+3

'BufferBlock'을 드롭하면 위와 같이 구성된 하나의'ActionBlock'은 4의 용량을 가지게됩니다. 두 개의 처리 중 하나와 두 개의 버퍼가있는 두 개의 작업 만 주어진 시간에 처리됩니다. 불행히도'BoundedCapacity'를 블록으로 설정 한 블록은 처리량이 1이고 버퍼가 1 인 블록 2를 여전히 제공합니다. – JSteward

관련 문제