如何实现一个等待元素弹出的堆栈
Posted
技术标签:
【中文标题】如何实现一个等待元素弹出的堆栈【英文标题】:How to implement a stack that waits until element comes to make pop 【发布时间】:2016-09-05 15:21:03 【问题描述】:我的问题与我将要描述的不同,但本质是类比。
让我们考虑一个stack
。堆栈具有方法pop()
。此方法从顶部移除元素并返回它。
问题
当栈中没有元素时,不要抛出异常。而是等到一个元素可以被弹出(即当一个新元素被推送时)。
我为此集思广益几个小时,以下是我想到的一些想法:
TPL 数据流 反应式扩展SpinWait.SpinUntil()
我不确定这些是否是解决问题的好方法,但它闻起来像可观察。
如何处理?
目标:在Parallel.ForEach
内消耗弹出。当资源可用时,应尽快归还。
【问题讨论】:
BlockingCollection
在 System.Collections.Concurrent;听起来像你想要的。它有一个GetConsumingEnumerable()
,当与 foreach 循环一起使用时,它会在元素存在时获取元素,并在为空时等待。这些也是线程安全的。
【参考方案1】:
我认为您需要一个带有命令的队列(例如pop()
)。
当堆栈中没有元素时,pop()
命令不会执行,而是留在队列中。
一旦将某些内容插入堆栈,命令解释器将检查它是否可以执行命令(在您的情况下为pop()
)然后执行它。
如果stack
发生更改,您可以使用async
模式通知您,解释器将据此执行命令。这样您就可以避免轮询以检查堆栈状态是否已更改。
Observable Collection
似乎也是一个不错的选择。
【讨论】:
以上是关于如何实现一个等待元素弹出的堆栈的主要内容,如果未能解决你的问题,请参考以下文章