2

Der Titel meiner Frage sagt alles.Gibt es einen TPL-Datenflussblock, der keine Eingabe, sondern Ausgabe zurückgibt?

Ich bin auf der Suche nach einem TPL-Datenfluss-Block, der keine Eingabe benötigt.

Momentan benutze ich einen Transformationsblock, aber der Eingang ist unbenutzt.

+0

Nr Warum müssen Sie es auch? Vielleicht können wir so etwas schaffen. – i3arnon

+0

Mein erster Block zieht Daten aus einer Warteschlange. Es benötigt keine Eingabe, um Daten aus der Warteschlange zu ziehen. –

+0

@BilalFazlani eigentlich, es hat einen Eingang. Die Warteschlange selbst Ein TransformManyBlock kann die Warteschlange als Eingabe empfangen und den Inhalt als Ausgabe zurückgeben. Oder Sie können Ihre Warteschlange durch einen BufferBlock (der auch eine Warteschlange ist) ersetzen. Oder Sie könnten einfach eine Schleife verwenden, die Nachrichten aus der Warteschlange knallt und sie an den ersten Block –

Antwort

3

würde ich einen Block wie dies von einem BufferBlock<T> bauen: die Methode akzeptiert einen Delegierten, der die ITargetBlock<T> Seite des Blocks präsentiert und gibt die ISourceBlock<T> Seite davon. Auf diese Weise kann der Delegat eine Eingabe an den Block senden, aber von außen sieht er wie ein Block aus, der nur die Ausgabe erzeugt.

Der Code:

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; 
} 

Beispiel Nutzung:

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

ITargetBlock<int> consumer = …; 

producer.LinkTo(consumer); 
+0

Ich suchte nach einem Beispiel für ISourceBlock Implementierung, aber das ist einfach und elegant! – Guge