2

제 질문의 제목은 모두를 말합니다.입력을받지 않지만 출력을 반환하는 TPL 데이터 흐름 블록이 있습니까?

입력이 필요하지 않은 TPL 데이터 흐름 블록을 찾고 있습니다.

지금은 변환 블록을 사용하고 있지만 입력은 사용되지 않습니다.

+0

번호가 왜 당신이 너무 필요합니까? 어쩌면 우리는 그런 것을 만들 수 있습니다. – i3arnon

+0

첫 번째 블록이 대기열에서 데이터를 가져옵니다. 대기열에서 데이터를 가져 오는 데는 입력이 필요하지 않습니다. –

+0

@BilalFazlani 실제로, 입력이 있습니다. 큐 자체. TransformManyBlock은 큐를 입력으로 받고 그 내용을 출력으로 반환 할 수 있습니다. 또는 대기열을 BufferBlock (대기열이기도 함)으로 교체 할 수 있습니다. 또는 대기열의 메시지를 팝업하고 첫 번째 블록에 게시하는 루프를 사용할 수 있습니다. –

답변

3

BufferBlock<T>에서 블록을 작성합니다.이 메서드는 블록의 ITargetBlock<T>면을 나타내는 대리자를 받아 들여 ISourceBlock<T>면을 반환합니다. 이렇게하면 델리게이트는 블록에 입력을 보낼 수 있지만 외부에서는 출력 만 생성하는 블록처럼 보입니다.

코드 :

public static ISourceBlock<T> CreateProducerBlock<T>(
    Func<ITargetBlock<T>, Task> producer, 
    int boundedCapacity = DataflowBlockOptions.Unbounded) 
{ 
    var block = new BufferBlock<T>(
     new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity }); 

    Task.Run(async() => 
    { 
     try 
     { 
      await producer(block); 

      block.Complete(); 
     } 
     catch (Exception ex) 
     { 
      ((IDataflowBlock)block).Fault(ex); 
     } 
    }); 

    return block; 
} 

사용 예제 :

var producer = CreateProducerBlock<int>(async target => 
{ 
    await target.SendAsync(10); 
    await target.SendAsync(20); 
}); 

ITargetBlock<int> consumer = …; 

producer.LinkTo(consumer); 
+0

ISourceBlock 구현 예를 찾고 있었지만 간단하고 우아합니다! – Guge

관련 문제