堆栈空例外

时间:2013-01-02 12:09:28

标签: c# multithreading visual-studio-2012 stack fifo

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

我得到了错误的快照:

Stack Empty Exception

有人可以解释一下吗?

3 个答案:

答案 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)

如果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);