Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 当只是修改TInput而不创建不同的TOutput时,ActionBlock还是TransformBlock?_.net_Task Parallel Library_Tpl Dataflow - Fatal编程技术网

.net 当只是修改TInput而不创建不同的TOutput时,ActionBlock还是TransformBlock?

.net 当只是修改TInput而不创建不同的TOutput时,ActionBlock还是TransformBlock?,.net,task-parallel-library,tpl-dataflow,.net,Task Parallel Library,Tpl Dataflow,当菊花链连接修改相同TInput元素的多个块时,我可以使用ActionBlock或TransformBlock,区别在于转换的委托将返回相同的(但修改的元素),而动作委托不会返回任何内容,它只会修改输入元素 这两种方法都有效,我想这两种方法在语义上都有一定的意义,但我假设其中只有一种是预期的方法 如果我不得不猜测的话,我会说这是一个动作,因为当返回相同的元素时,这并不是一个真正的转换。但是如果出于更实际的原因我不得不猜测,我会说Transform,因为如果我将这些块菊花链接起来,Transfor

当菊花链连接修改相同
TInput
元素的多个块时,我可以使用
ActionBlock
TransformBlock
,区别在于转换的委托将返回相同的(但修改的元素),而动作委托不会返回任何内容,它只会修改输入元素

这两种方法都有效,我想这两种方法在语义上都有一定的意义,但我假设其中只有一种是预期的方法


如果我不得不猜测的话,我会说这是一个动作,因为当返回相同的元素时,这并不是一个真正的转换。但是如果出于更实际的原因我不得不猜测,我会说Transform,因为如果我将这些块菊花链接起来,Transform似乎允许我将一个“已处理”的元素直接发布到下一个块,但不确定如何通过操作强制执行该操作。

如果您想修改块中的对象,然后在另一个块中使用它,那么唯一正确的选择就是使用
TransformBlock
。我认为这是一个转换:结果对象与原始对象具有相同的标识,但它在块中被修改(或“转换”)


ActionBlock
最常用作管道的最后一步。这不是您想要的,因此
ActionBlock
是不合适的。

一个想法:您是否必须修改元素而不是转换它?我希望转换方法更容易诊断,因为所有正常的不变性好处。我想我可以通过创建实现或封装原始类的不同“修改”类来“丰富”我的体系结构。例如,假设我正在修改的元素的类型为
Bimbo
,操作包括分配一个类别。我可以创建一个新类“ClassifiedBimbo”,我的lambda类似于
public ClassifiedBimbo ClassifyBimbo(Bimbo Bimbo)
。这有意义吗?是的,我觉得这是个好主意。根据我的经验,如果你能接受不变性,那么数据管道最终会变得更简单,也更清晰。