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);
Nr Warum müssen Sie es auch? Vielleicht können wir so etwas schaffen. – i3arnon
Mein erster Block zieht Daten aus einer Warteschlange. Es benötigt keine Eingabe, um Daten aus der Warteschlange zu ziehen. –
@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 –