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

の場合、およびマルチスレッドを使用してSharedMemoryいるためStack、および.Net4を使用している場合。使用する必要があります: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 に答える