2017-01-05 1 views
0

나는 두 숫자를 받아서 그들로부터 System.Windows.Point를 생성하는 대리자를 가지고있다.두 개의 입력 인수를받는 Dataflow TransformBlock이 있습니까? 나는 그것을 수행하는 TPL 데이터 흐름, 특히 TransformBlock를 사용하는 방법을 배우고 싶은</p> <pre><code>(x, y) => new Point(x,y); </code></pre> <p>:

나는 이런 식으로 뭔가를 할 것이다 :

ISourceBlock<double> Xsource; 
ISourceBlock<double> Ysource; 

ITargetBlock<Point> PointTarget; 

// is there such a thing? 
TransformBlock<double, double, Point> PointCreatorBlock; 

// and also, how should I wire them together? 

UPDATE :

또한

, 나는 두 개 이상의 인수를 연결하는 네트워크를 조립하는 방법? 예를 들어, 8 개의 인수를받는 메소드가 있다고 가정 해 봅니다. 각 인수는 서로 다른 버퍼에서 가져옵니다. 모든 인수에 하나의 인스턴스를 사용할 수있는 시점을 알고 객체를 만들 수있는 블록을 만들려면 어떻게해야합니까?

답변

2

당신이 찾고있는 것이 조인 블록이라고 생각합니다. 현재 두 개의 입력 및 세 개의 입력 변형이 있으며 각각은 튜플을 출력합니다. 이것들은 결합되어 8 개의 매개 변수 결과를 생성 할 수 있습니다. 또 다른 방법은 매개 변수를 보유하고 다양한 블록을 사용하여 매개 변수 클래스를 처리하고 구성하는 클래스를 만드는 것입니다. 두 점의 int를 결합하는 간단한 예

:

class MyClass { 

    BufferBlock<int> Xsource; 
    BufferBlock<int> Ysource; 
    JoinBlock<int, int> pointValueSource; 
    TransformBlock<Tuple<int, int>, Point> pointProducer; 

    public MyClass() { 
     CreatePipeline(); 
     LinkPipeline(); 
    } 

    private void CreatePipeline() { 
     Xsource = new BufferBlock<int>(); 

     Ysource = new BufferBlock<int>(); 

     pointValueSource = new JoinBlock<int, int>(new GroupingDataflowBlockOptions() { 
      Greedy = false 
     }); 

     pointProducer = new TransformBlock<Tuple<int, int>, Point>((Func<Tuple<int,int>,Point>)ProducePoint, 
      new ExecutionDataflowBlockOptions() 
      { MaxDegreeOfParallelism = Environment.ProcessorCount }); 
    } 

    private void LinkPipeline() { 
     Xsource.LinkTo(pointValueSource.Target1, new DataflowLinkOptions() { 
      PropagateCompletion = true 
     }); 

     Ysource.LinkTo(pointValueSource.Target2, new DataflowLinkOptions() { 
      PropagateCompletion = true 
     }); 

     pointValueSource.LinkTo(pointProducer, new DataflowLinkOptions() { 
      PropagateCompletion = true 
     }); 

     //pointProduce.LinkTo(Next Step In processing) 
    } 

    private Point ProducePoint(Tuple<int, int> XandY) { 
     return new Point(XandY.Item1, XandY.Item2); 
    } 
} 

그 출력을 생성하는 입력 버퍼 모두 사용할 데이터가 JoinBlock까지 기다릴 것이다. 또한이 경우 입력 버퍼에서 X와 Y가 순서대로 도착하지 않으면 다시 동기화해야합니다. 조인 블록은받은 첫 번째 X 값과 첫 번째 Y 값만 결합합니다.

관련 문제