BufferBlock<T>
是一个非常好的队列异步接口。
我正在寻找的是类似的东西但是对于LIFO堆栈。我在传递BlockingCollection
时正在寻找ConcurrentStack
的等效功能,但我没有在Take和Add上阻止线程,而是希望TakeAsync
和AddAsync
。这基本上是BufferBlock<T>
给我的,但它是一个FIFO队列,我需要一个LIFO堆栈。
我正在寻找一个无锁版的异步堆栈。我不在乎它是否适合数据流,我只是以BufferBlock
为例。我不打算将其与数据流结合使用。
答案 0 :(得分:4)
TPL Dataflow
当然不支持此类功能,否则就不会有“流”。
你可以做的是使用Stephen Cleary的AsyncCollection
。它是围绕任何IProducerConsumerCollection
的异步包装器,在您的情况下可能是ConcurrentStack
var stack = new ConcurrentStack<int>();
var asyncStack = new AsyncCollection<int>(stack);
await asyncStack.AddAsync(4);
await asyncStack.AddAsync(6);
int top = await asyncStack.TakeAsync();