제 질문의 제목은 모두를 말합니다.입력을받지 않지만 출력을 반환하는 TPL 데이터 흐름 블록이 있습니까?
입력이 필요하지 않은 TPL 데이터 흐름 블록을 찾고 있습니다.
지금은 변환 블록을 사용하고 있지만 입력은 사용되지 않습니다.
제 질문의 제목은 모두를 말합니다.입력을받지 않지만 출력을 반환하는 TPL 데이터 흐름 블록이 있습니까?
입력이 필요하지 않은 TPL 데이터 흐름 블록을 찾고 있습니다.
지금은 변환 블록을 사용하고 있지만 입력은 사용되지 않습니다.
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);
ISourceBlock
번호가 왜 당신이 너무 필요합니까? 어쩌면 우리는 그런 것을 만들 수 있습니다. – i3arnon
첫 번째 블록이 대기열에서 데이터를 가져옵니다. 대기열에서 데이터를 가져 오는 데는 입력이 필요하지 않습니다. –
@BilalFazlani 실제로, 입력이 있습니다. 큐 자체. TransformManyBlock은 큐를 입력으로 받고 그 내용을 출력으로 반환 할 수 있습니다. 또는 대기열을 BufferBlock (대기열이기도 함)으로 교체 할 수 있습니다. 또는 대기열의 메시지를 팝업하고 첫 번째 블록에 게시하는 루프를 사용할 수 있습니다. –