我正在尝试围绕堆栈设计一个数据结构,该结构会阻塞直到堆栈有可用的项目。我尝试使用 anAutoResetEvent
但我想我误解了同步过程的工作原理。基本上,看下面的代码,当没有可用的东西时,我试图从堆栈中弹出。
似乎它的AutoResetEvent
行为就像一个信号量。那是对的吗?我可以摆脱Set()
它BlockingStack.Get()
并完成它吗?或者这会导致我只使用我的堆栈项目之一的情况。
public class BlockingStack
{
private Stack<MyType> _internalStack;
private AutoResetEvent _blockUntilAvailable;
public BlockingStack()
{
_internalStack = new Stack<MyType>(5);
_blockUntilAvailable = new AutoResetEvent(false);
for (int i = 0; i < 5; ++i)
{
var obj = new MyType();
Add(obj);
}
}
public MyType Get()
{
_blockUntilAvailable.WatiOne();
lock (_internalStack)
{
var obj = _internalStack.Pop();
if (_internalStack.Count > 0)
{
_blockUntilAvailable.Set(); // do I need to do this?
}
return obj;
}
}
public void Add(MyType obj)
{
lock (_internalStack)
{
_internalStack.Push(obj);
_blockUntilAvailable.Set();
}
}
}
我的假设是当一个函数调用AutoResetEvent
通过时所有等待线程的重置。WaitOne()
但是,似乎有多个线程进入。除非我在某个地方搞砸了我的逻辑。
编辑:这是给 Silverlight 的。