Я сейчас читаю о трубопроводах TPL Dataflow, и есть кое -что, что мне любопытно, когда дело доходит до Transformblocks. Насколько я понимаю, Transformblock принимает вход типа Tinput, преобразует его, затем возвращает новый результат как тип Tooutput, чтобы быть переданным в другой блок, возможно. А выход - это ссылка на вход? Предположим, что объект слишком большой, где он не будет эффективным. Рассмотрим этот пример: < /p>
Предположим, у меня есть строка, где мне нужно применять тяжелые соратники на нее последовательно. Чтобы сохранить память, я буду использовать StringBuilder. Вот блоки. < /P>
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);
< /code>
Итак, это на самом деле просто конвейер Transformblocks, но большинство из них просто изменяют SB на месте. Когда я думал об этом, это выглядит об этом. В контексте блоков Op1block и Op2block имеют побочные эффекты, но возвращают значение, которое очень опасно. В контексте всего трубопровода не может быть никаких проблем, поскольку государства никогда не обмениваются, и они передаются последовательно, поэтому следующий блок всегда будет получать наиболее обновленное значение. Тем не менее, я мог бы ошибаться в этом и хотел бы разъяснить. Я не уверен, что обработка SB все еще может считаться неизменной во всех блоках, или она может ввести проблемы в будущем.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... formblocks