任务数据流,数据块是否可以从完成状态更改?

时间:2013-04-12 09:38:39

标签: c# task-parallel-library tpl-dataflow

我想知道是否可以更改数据块的完成状态?

例如,我标记了一个var block = new BufferBlock<int>();数据块,其中包含block.Complete()。该块链接到其他数据块。我想知道是否可以通过将其完成状态更改回其原始状态来使block再次运行。

如果不可能,我怎么能执行多次运行,包括完成,而不必a)去链接所有块,b)重新实例化所有块,c)再次重新链接所有块?

任何可以简化运行数据流周期任务的想法,包括完成链中的每个块而无需重新创建整个框架?

由于

1 个答案:

答案 0 :(得分:4)

不,您不能“完成”已完成的数据流块。我认为你应该做的是为每条消息添加一个标志,说明它是否是运行中的最后一条消息。为了简化它,你可以创建一组辅助方法,如:

public static TransformBlock<Tuple<TInput, bool>, Tuple<TOutput, bool>>
    CreateEnhancedTransformBlock<TInput, TOutput>(Func<TInput, TOutput> transform)
{
    return new TransformBlock<Tuple<TInput, bool>, Tuple<TOutput, bool>>(
        tuple => Tuple.Create(transform(tuple.Item1), tuple.Item2));
}

这样,您输入的transform代表只处理TInputTOuput,并且该标记会随每条消息一起转移。