非同期await
の結果を確認したいBlockingCollection<T>.Take()
ので、スレッドをブロックしません。このようなものを探しています:
var item = await blockingCollection.TakeAsync();
私はこれができることを知っています:
var item = await Task.Run(() => blockingCollection.Take());
しかし、ThreadPool
代わりに(の)別のスレッドがブロックされるため、それはアイデア全体をやや殺します。
代替手段はありますか?
私が知っている4つの選択肢があります。
1つはチャネルで、非同期Read
とWrite
操作をサポートするスレッドセーフキューを提供します。チャネルは高度に最適化されており、オプションで、しきい値に達した場合に一部のアイテムをドロップすることをサポートしています。
次はTPLデータフローBufferBlock<T>
からです。コンシューマーが1つしかない場合は、またはを使用するか、単にリンクすることができます。詳細については、私のブログを参照してください。OutputAvailableAsync
ReceiveAsync
ActionBlock<T>
最後の2つは私が作成したタイプで、AsyncExライブラリで利用できます。
AsyncCollection<T>
は、とasync
ほぼ同等でありBlockingCollection<T>
、ConcurrentQueue<T>
またはなどの同時プロデューサー/コンシューマーコレクションをラップできConcurrentBag<T>
ます。TakeAsync
コレクションからアイテムを非同期的に消費するために使用できます。詳細については、私のブログを参照してください。
AsyncProducerConsumerQueue<T>
よりポータブルなasync
互換性のあるプロデューサー/コンシューマーキューです。を使用DequeueAsync
して、キューからアイテムを非同期的に消費できます。詳細については、私のブログを参照してください。
これらの選択肢の最後の3つは、同期および非同期のプットとテイクを可能にします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加