我正在尝试设计一种围绕堆栈的数据结构,当堆栈有可用项目时会阻塞。我尝试使用AutoResetEvent,但我认为我误解了同步过程的工作方式。基本上,查看以下代码,我正在尝试从堆栈弹出一个元素,但没有可用项目。
似乎AutoResetEvent的行为类似于信号量。这是正确的吗?我可以在BlockingStack.Get()中摆脱Set()并完成它吗?还是这会导致我只使用一个堆栈项的情况?
我的假设是当一个线程通过
编辑:这是针对Silverlight的。
似乎AutoResetEvent的行为类似于信号量。这是正确的吗?我可以在BlockingStack.Get()中摆脱Set()并完成它吗?还是这会导致我只使用一个堆栈项的情况?
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();
}
}
}
我的假设是当一个线程通过
WaitOne()
函数调用时,AutoResetEvent
会为所有等待的线程重置。然而,似乎有多个线程正在进入。除非我在逻辑上搞错了什么。编辑:这是针对Silverlight的。