-1

ブロッキング コレクションのパフォーマンスが遅く見える理由を確認しようとしています。私のコードの簡単なバージョンは、以下の質問に示されています。

ここでの私の質問は、 BlockingCollection.TryTake(object,TimeSpan) が新しいデータにすぐに戻るかどうかです?

TimeSpan gridNextTS = new TimeSpan(0, 0, 60);

if (trPipe.TryTake(out tr, gridNextTS) == false)

私のテストでは、データがすぐには返されないようです。それはおそらく望ましい動作のように思えますか、それとも間違って使用していますか?

コードの前の質問の詳細:

BlockingCollection を使用した Consumer/Producer が遅く見える

4

1 に答える 1

4

簡潔なベンチマークはBlockingCollection<T>、実際には、 に指定されたタイムアウト値に関係なく、かなり迅速にハンドオーバーを実行することを示していますTryTake

public async Task BlockingCollectionPerformance()
{
    using (var collection = new BlockingCollection<int>())
    {
        var consumer = Task.Run(() =>
        {
            var i = 0;

            while (collection.TryTake(out i, TimeSpan.FromSeconds(2)))
            {
                Debug.Print(i.ToString());
            }
        });

        var producer = Task.Run(() =>
        {
            try
            {
                for (var i = 0; i < 10; i++)
                {
                    collection.Add(i);
                }
            }
            finally
            {
                collection.CompleteAdding();
            }
        });

        await Task.WhenAll(producer, consumer);
    }
}

上記は、私のボックスでは約 3 ミリ秒で完了します。

ただし、より具体的に言うとTryTake、項目がコレクションに追加されるたびに (そして をTryTake返すtrue)、またはブロッキング コレクションを呼び出しCompleteAddingたときに (この場合、タイムアウトを待っても意味がなく、 をTryTake返します)、すぐに戻りますfalse。呼び出しを行わない場合、必要以上に長くコンシューマーをブロックしたままにしておくことで、自分自身を撃つことできます。CompleteAddingTryTakefalse

于 2014-07-14T10:20:24.890 に答える