7

我得到一个堆栈空异常。如果堆栈不为空(它有 16 个项目),这怎么可能?

我得到了错误的快照:

堆栈空异常

有人可以解释一下吗?

4

3 回答 3

7

使用类似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);
}
于 2013-01-02T12:18:45.470 回答
5

堆栈怎么可能已满并且有 16 个项目??!

在多线程环境中这是很有可能的。

你在你的程序中使用了多个线程吗?如果是,SharedMemory则应在对其lock进行任何更改之前进行编辑。

于 2013-01-02T12:15:02.443 回答
3

如果SharedMemoryStack, 并且因为您使用的是多线程并且如果您使用的是 .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);
于 2013-01-02T12:18:33.330 回答