Ich lese gerade über TPL DataFlow -Pipelines und es gibt etwas Neugieriges, wenn es um Transformblocks geht. Wie ich es verstehe, akzeptiert TransformBlock eine Eingabe vom Typ Tinput , transformiert es und gib das neue Ergebnis als Typ Toutput zurück, um in einen anderen Block übergeben zu werden. Und der Ausgang ist ein Hinweis auf die Eingabe? Angenommen, das Objekt ist zu groß, wenn das Kopieren oder Klonen es nicht effizient wäre. Betrachten Sie dieses Beispiel: < /p>
Angenommen, ich habe eine Zeichenfolge, in der ich nacheinander schwere Verkettungen darauf anwenden muss. Um den Speicher zu speichern, würde ich StringBuilder verwenden. Hier sind die Blöcke. < /P>
Code: Select all
var sbBlock = new TransformBlock(str => new StringBuilder(str));
var op1Block = new TransformBlock(sb =>
{
// call API
// concat to sb
return sb;
});
var op2Block = new TransformBlock(sb =>
{
// call API
// concat to sb
return sb;
});
sbBlock.LinkTo(op1Block, blockOptions);
op1Block.LinkTo(op2Block, blockOptions);
Es ist also wirklich nur eine Pipeline von Transformblocks, aber die meisten von ihnen ändert nur SB an Ort und Stelle. Als ich darüber nachdachte, sieht es besorgniserregend aus. Im Kontext von Blöcken haben OP1Block und Op2Block Nebenwirkungen und geben jedoch einen Wert zurück, was sehr gefährlich ist. Im Kontext der gesamten Pipeline kann es keine Probleme geben, da die Staaten nie geteilt werden und sie nacheinander übergeben werden, sodass der nächste Block immer den aktuellsten Wert erhält. Ich könnte mich jedoch irren und möchte Klarstellung. Ich bin mir nicht sicher, ob die Verarbeitung von SB für alle Blöcke weiterhin als unveränderlich angesehen werden kann, oder es kann Probleme in der Zeile einführen.>