2013-04-25 7 views
2

첫 번째 항목이 입력 버퍼에서 수신되거나 데이터 블록에서 처리 될 때 일회성 알림에 가입 할 수 있는지 궁금합니다. 데이터 블록 내에 플래그를 설정할 수 있지만 각 새 항목의 플래그를 확인하면 오버 헤드가 발생한다는 것을 알고 있습니다. 내 데이터 블록은 수백만 개의 항목을 처리하므로 불필요한 오버 헤드가 추가됩니다.TPL 데이터 흐름, 데이터 블록이 첫 번째 항목을 받았을 때의 알림

첫 번째 수신 항목에 대한 알림을받는 더 좋은 방법이 있습니까?

+0

입력 버퍼를 'BroadcastBlock'에 연결하면 메인 데이터 흐름과 ['WriteOnceBlock '] (http://msdn.microsoft.com/en-us/library/hh194820.aspx)로 연결됩니다. ? 'WriteOnceBlock'은 한번 쓰여질 것입니다. (첫 번째 항목) ... –

+0

정말로 'bool'하나를 검사하는 것이 불필요한 오버 헤드라고 말하고 있습니까? 의심 스럽다. 이것을 측정 해 보셨습니까? – svick

+0

흠, 확실히 깔끔한 아이디어, WriteOnceBlock 사용. 어쨌든 브로드 캐스트 블록을 사용하므로 제대로 작동합니다. 항목이 브로드 캐스트 블록을 통해 스트리밍되었으므로 나중에 거부 된 메시지를 처리 ​​할 필요가 없다고 생각합니까? –

답변

1

알림을 처리하는 블록에 MaxMessages = 1 인 링크를 만들 수 있습니다. 이 링크는 단일 메시지를 전달한 후에 제거됩니다.

+0

그러나 정상적인 블록의 경우 이는이 블록 만 알림을 수신한다는 것을 의미합니다. 일반 대상은 그렇지 않습니다. – svick

+0

흠, 네 말이 맞아. 알림 블록에서 메시지를 일반 대상으로 전달할 수는 있지만 메시지가 재정렬 될 수 있습니다. 또는이 경우 브로드 캐스트 블록을 사용하여이 문제를 해결할 수 있습니다. – pkt

0

(I이 너무 늦게 11개월 알고 ...하지만 난이 좋은 생각이 아닌 이유 누군가가 말해 것이라는 희망에 응답하고 있습니다.)

당신은 특정 블록 X 곳이 첫 번째 메시지가 언제 도착하는지 알고 싶습니다. 그것에는 업스트림 블록이 있습니다. 업스트림 블록과 블록 X 사이에 삽입하고 TransformBlock을 업스트림 블록에서 MaxMessages = 1로 연결하여 첫 번째 메시지를 가져올 때 즉시 연결 해제되도록합니다. 이는 또한 업스트림 블록을 차단합니다. 삽입 된 TransformBlock의 Func은 델리게이트에서 다음 세 가지를 수행합니다.

  1. "첫 번째 블록이 수신되었다는 알림"이 무엇이든 나타납니다.
  2. 후속 블록 X를 업스트림 블록에 연결합니다.
  3. 은 X.에게 말하면

... 삽입 된 블록이 허용하고 제 1 데이터 항목을 통과하여 흐름에서 접합되어 전달을 차단하기가 인수 불변 반환.