2013-04-12 6 views
5

データブロックの完了状態を変更することが可能かどうかを知りたいですか?タスクデータフロー、データブロックを完了状態から変更できますか?

たとえば、block.Complete()と書かれたvar block = new BufferBlock<int>();データブロックをマークしました。ブロックは他のデータブロックにリンクされています。私はblockを完了状態を元の!complete状態に戻して再実行できるかどうかを知りたいと思います。

a)すべてのブロックのデリンクを解除しなくても、b)すべてのブロックを再インスタンス化し、c)すべてのブロックを再度リンクする必要はありませんか?

フレーム全体を再作成せずに各ブロックを完了することを含むデータフローのサイクルを簡単に実行できるアイデアはありますか?

おかげ

+1

なぜ別々のランが必要なのですか?また、なぜデータフローネットワークを再構築したくないのですか?パフォーマンスに影響するとは思えませんが(1秒間に何回も実行しない限り)、コードをもっと複雑にするべきではありません。 – svick

+0

個別の実行は要件の一部です。ネットワーク全体を再作成すると、tplデータフローの選択によって得られる効率が完全に無効になります。主な頭痛は、各データフローブロックの再作成ではなく、リンクを解除して再リンクすることです。完了状態を変更できない場合、どうすれば各データフローブロックの完了状態に影響を与えずに完了を通知できますか?私は原子のフラグを送信することはできません。なぜなら、チェーンのオブジェクトタイプが同一ではないからです(変換ブロックが含まれています)。 –

答えて

3

いいえ、あなたが完了し、データフローブロック「uncomplete」することはできません。私はあなたがすべきことは、実行中の最後のメッセージかどうかを示すフラグを各メッセージに追加することだと思います。

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)); 
} 

この方法では、あなただけのTInputTOuputを扱うとフラグが各メッセージと一緒に転送されtransformデリゲートを入力します。それは単純にそれで動作するようにするには、次のようなヘルパーメソッドのセットを作成することができます。

+0

面白い考えですが、実行中の計算上のオーバーヘッドについては、このルートを使ってコメントしてください。これまでのところ、受信メッセージごとに受信側ブロックの「完了フラグ」がチェックされていました。私が省略しているものは何ですか?ブールよりむしろenumを代わりに運ぶほうが高価でしょうか?そのようにして、私はちょうど完了以外の他の州に伝えることができます。 –

+1

@Freddy 1つではなく2つのデリゲート呼び出しがあるため、わずかなオーバーヘッドがありますが、それは実際にはごくわずかです。そして、私は 'bool'を列挙型に置き換えてもパフォーマンスには影響しません。 – svick

+0

この問題を解決するには、間違いなく良いアイデアですが、最終的に私はあなたの最初の助言を受けました。データブロックのきちんとした完成機能を熟読し、パイプライン全体を再作成します。モジュールを含む上流のデータブロックにコールバックを提供し、各データブロックの完了時にそれを再作成し、2つのブロックが再リンクされるコールバック下流に渡します。 –

関連する問題