2013-04-12 5 views
5

데이터 블록의 완료 상태를 변경할 수 있는지 여부를 알고 싶습니다.작업 데이터 흐름, 완료 상태에서 데이터 블록을 변경할 수 있습니까?

예를 들어 block.Complete()으로 끝나는 var block = new BufferBlock<int>(); 데이터 블록을 표시했습니다. 블록은 다른 데이터 블록에 연결됩니다. block을 완료 상태를 원래의 완료 상태로 다시 변경하여 다시 실행할 수 있는지 여부를 알고 싶습니다.

a) 모든 블록의 연결을 해제하지 않고 b) 모든 블록을 다시 인스턴스화하고 c) 모든 블록을 다시 연결하지 않고 완료를 포함하여 여러 번의 실행을 수행 할 수 없다면 어떻게 할 수 있습니까?

전체 프레임 워크를 다시 만들 필요없이 체인을 따라 각 블록을 완료하는 것을 포함하여 데이터 흐름주기를 쉽게 할 수있는 아이디어가 있습니까?

감사

+1

왜 별도로 실행해야합니까? 또한 데이터 흐름 네트워크를 다시 만들고 싶지 않은 이유는 무엇입니까? 퍼포먼스에 영향을 미칠지는 의심 스럽지만 (초당 여러 번하지 않는 한), 코드가 훨씬 복잡해지지 않아야합니다. – svick

+0

별도의 실행은 요구 사항의 일부입니다. 전체 네트워크를 재생성하면 tpl 데이터 흐름의 선택을 통해 얻은 효율성을 완전히 상실하게됩니다. 주요 골칫거리는 각 데이터 흐름 블록의 재 작성이 아니라 연결 해제 및 다시 링크입니다. 완료 상태를 변경할 수 없다면 어떻게하면 각 데이터 흐름 블록의 완료 상태에 영향을 미치지 않고 완료 신호를 보낼 수 있습니까? 체인 아래의 객체 유형이 동일하지 않기 때문에 원자 플래그를 보낼 수 없습니다 (변형 블록이 관련되어 있음). –

답변

3

아니, 당신은 할 수 없다 "uncomplete"완성 된 흐름 블록. 당신이해야 할 일은 그것이 마지막 메시지인지 여부를 알려주는 플래그를 각 메시지에 추가하는 것입니다.

public static TransformBlock<Tuple<TInput, bool>, Tuple<TOutput, bool>> 
    CreateEnhancedTransformBlock<TInput, TOutput>(Func<TInput, TOutput> transform) 
{ 
    return new TransformBlock<Tuple<TInput, bool>, Tuple<TOutput, bool>>(
     tuple => Tuple.Create(transform(tuple.Item1), tuple.Item2)); 
} 

이 방법은, 당신은 단지 TInputTOuput 취급 및 플래그가 각 메시지와 함께 옮겨진되는 transform 대리자를 입력 : 그것은 간단 함께 작동하도록하려면, 당신은 같은 헬퍼 메소드 세트를 만들 수 있습니다.

+0

재미있는 아이디어입니다.이 경로를 통해 실행 중 계산 오버 헤드에 대해 의견을 보내시겠습니까? 지금까지는 각 수신 메시지에 대한 수신자 블록의 "완료 플래그"에 대한 추가 검사 만 볼 수 있습니다. 내가 빠뜨린 다른 것? bool보다는 enum을 대신 배송하는 것이 더 비쌉니까? 그런 식으로 나는 단지 완성보다 다른 상태를 알릴 수 있었다. –

+1

@Freddy 하나가 아닌 두 개의 위임 호출이 있기 때문에 약간의 오버 헤드가있을 수 있지만 실제로는 무시해도 좋습니다. 그리고'bool'을 열거 형으로 대체하는 것이 성능에 영향을주지 않아야한다고 생각합니다. – svick

+0

이 문제를 해결하는 데 좋은 아이디어가되었지만 결국에는 첫 번째 조언을 들어 보았습니다. 데이터 블록의 깔끔한 완성 기능을 검토하고 전체 파이프 라인을 다시 만듭니다. 모듈을 포함하는 업스트림 데이터 블록에 콜백을 제공하고 각 데이터 블록의 완료시 동일한 데이터 블록을 다시 생성하고 두 블록이 다시 링크 된 콜백 다운 스트림을 통해 전달합니다. –