我得到一个堆栈空异常。如果堆栈不为空(它有16个项目),那怎么可能?
我得到了错误的快照:
有人可以解释一下吗?
答案 0 :(得分:6)
使用Stack<T>
之类的内容时必须同步访问权限。最简单的方法是使用lock
,然后让你使用lock
进行同步; pop会是:
int item;
lock (SharedMemory)
{
while (SharedMemory.Count == 0)
{
Monitor.Wait(SharedMemory);
}
item = SharedMemory.Pop();
}
Console.WriteLine(item);
并推送:
lock (SharedMemory)
{
SharedMemory.Push(item);
Monitor.PulseAll(SharedMemory);
}
答案 1 :(得分:5)
堆栈是如何可能完整的&amp;有16个项目??!
在多线程环境中,它非常有可能。
您在程序中使用多个线程吗?如果是,SharedMemory
应该lock
,然后再对其进行任何更改。
答案 2 :(得分:3)
如果SharedMemory
是Stack
,并且因为您正在使用多线程,并且您使用的是.Net 4。你应该使用:ConcurrentStack
修改强>
在我的第一次编辑和来自 Quartermeister 的精彩评论之后,这是一个更简单的工作解决方案:
int item;
var SharedMemory = new BlockingCollection<int>(new ConcurrentStack<int>());
// later in the Consume part
item = SharedMemory.Take(); // this will block until there is an item in the list
Console.WriteLine(item);