我得到一个堆栈空异常。如果堆栈不为空(它有 16 个项目),这怎么可能?
我得到了错误的快照:
有人可以解释一下吗?
我得到一个堆栈空异常。如果堆栈不为空(它有 16 个项目),这怎么可能?
我得到了错误的快照:
有人可以解释一下吗?
使用类似Stack<T>
. _ 最简单的方法是使用lock
,然后您也可以将lock
用于同步本身;所以流行会是:
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);
}
堆栈怎么可能已满并且有 16 个项目??!
在多线程环境中这是很有可能的。
你在你的程序中使用了多个线程吗?如果是,SharedMemory
则应在对其lock
进行任何更改之前进行编辑。
如果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);