현재 1 단계를 제외한 각 단계가 실행중인 소비자 및 생산자 async
인 파이프 라인 데이터 흐름에 대해 작업하고 있습니다. 나는 물건을 참조하는 파이프 라인을 통해 "흐르는"물체를 가지고있다. 3 단계에서는 특수 조건 (스테이지 루프)을 충족하는 모든 객체를 루프하고 버퍼링하려고합니다.TPL 데이터 흐름 - 조건 루프
다른 개체가 현재 버퍼링 (스테이지 루프)되어있는 동안 새로운 개체가 들어 오면 (참조 3 단계) 참조 항목과 일치하는지 확인하고 스테이지 루프의 BufferBlock
에 게시합니다.
질문 : 스테이지 3에서 스테이지 루프의 모든 객체에 대한 참조 항목을 어떻게 확인할 수 있습니까?
는파이프 라인은 좀 다음과 같습니다
Incoming objects ->
BufferBlock1 -> Parsing (Stage2) ->
BufferBlock2 -> Processing (Stage3) ->
BufferBlock3 -> Stage Loop ->
Back to BufferBlock 2
나는 타이밍 문제로 들어가고, object1이 들어오는 곳은 CheckForExistingProcessing 내에서 거절되고 stage4로 전달된다고 생각합니다. object2가 들어오고 Check를 전달하는 동안 두 객체의 참조 항목이 모두 릴리스되었으므로 그것에 자물쇠. 그래서 나는 심지어 검사를하기 전에 동일한 아이템을 참조하는 stage4에 객체가 있는지 확인해야합니다. 필요한 것은 대기열에 대한 검사에 기반하여 객체를 연기하고 대기열에있는 항목이 이미 같은 항목 인 경우 대기열을 유지하지만 대기열을 다시 사용할 수있을 때까지 객체를 유지하는 Queue입니다. – Peter
이 단계에서 BlockingCollection을 사용해 볼 수 있습니다. – VMAtm
루프를 제거하고 파이프 라인에서 잠글 수 있었고 이미 테스트 클래스를 만들었습니다. 하나의 질문을 tho, 내가 들어오는 순서대로 파일을 가져올 필요가 있다면 나는 "한 번에 하나의 파일"의 기지에 파이프 라인을 만들었습니다. SendAsync를 호출하면 어떻게 처리되는지를 어떻게 확인할 수 있습니까? 나는 파이프 라인 전에 BufferBlock을 추가 할 수 있는데, 여기서 소비자는 주문을 지키지 만 더 지능적인 방법이 있는가? – Peter