9

データフローをいじった後、新しい問題に遭遇しました。すべてのブロックの入力キューを制限したいと思います。私のプロデュース ブロック (ActionBlock) は、5000 個の要素を非常に高速に作成し、それらをブロードキャスト ブロックに投稿します。したがって、ブロードキャスト ブロックの BoundedCapacity を 100 に設定すると、大量のデータが破棄されます。しかし、プロデューシングブロックがバッファブロックの入力キューで新しいスロットを待つことを好みます。

この問題を解決する方法はありますか?

4

1 に答える 1

8

まさにそのBufferBlockためです。設定しBoundedCapacityていっぱいになると、誰かが消費するまでメッセージの受信が延期されます。これは、たとえばPost()がブロックされSendAsync()、 unfinished が返されることを意味しTaskます。

編集:複数のターゲットに送信し、データを破棄しない組み込みブロックはありません。ただし、ループから簡単に作成ActionBlockしてループを送信できます。

static ITargetBlock<T> CreateMultipleTargetsBlock<T>(
    IEnumerable<ITargetBlock<T>> targets, int boundedCapacity)
{
    var targetsList = targets.ToList();

    var block = new ActionBlock<T>(
        async item =>
        {
            foreach (var target in targetsList)
            {
                await target.SendAsync(item);
            }
        },
        new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity });

    // TODO: propagate completion from block to targets

    return block;
}

このコードは、ターゲットごとにデータを複製する必要がなく、ターゲットのリストが変更されないことを前提としています。そのためのコードの変更は非常に簡単です。

于 2013-09-17T12:03:45.840 に答える