异步堆栈相当于TPL Dataflow BufferBlock <t> </t>

时间:2014-05-26 03:51:19

标签: c# .net concurrency async-await tpl-dataflow

BufferBlock<T>是一个非常好的队列异步接口。

我正在寻找的是类似的东西但是对于LIFO堆栈。我在传递BlockingCollection时正在寻找ConcurrentStack的等效功能,但我没有在Take和Add上阻止线程,而是希望TakeAsyncAddAsync。这基本上是BufferBlock<T>给我的,但它是一个FIFO队列,我需要一个LIFO堆栈。

我正在寻找一个无锁版的异步堆栈。我不在乎它是否适合数据流,我只是以BufferBlock为例。我不打算将其与数据流结合使用。

1 个答案:

答案 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();