Неизменность и побочные эффекты с трансформационными блоками потока данныхC#

Место общения программистов C#
Anonymous
Неизменность и побочные эффекты с трансформационными блоками потока данных

Сообщение Anonymous »

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

Подробнее здесь: https://stackoverflow.com/questions/795 ... formblocks

Вернуться в «C#»