Ich bekomme eine Stapel leer Ausnahme. Wie ist das möglich, wenn der Stapel nicht leer ist (er hat 16 Gegenstände)?Stack Empty Exception
bekam ich eine Momentaufnahme des Fehlers:
Kann jemand bitte erklären?
Ich bekomme eine Stapel leer Ausnahme. Wie ist das möglich, wenn der Stapel nicht leer ist (er hat 16 Gegenstände)?Stack Empty Exception
bekam ich eine Momentaufnahme des Fehlers:
Kann jemand bitte erklären?
Sie Muss synchronisieren Zugriff, wenn etwas mit wie Stack<T>
. Der einfachste Ansatz ist die Verwendung von lock
, die dann auch die lock
für die Synchronisation selbst verwendet; so wäre Pop:
int item;
lock (SharedMemory)
{
while (SharedMemory.Count == 0)
{
Monitor.Wait(SharedMemory);
}
item = SharedMemory.Pop();
}
Console.WriteLine(item);
und Push wäre:
lock (SharedMemory)
{
SharedMemory.Push(item);
Monitor.PulseAll(SharedMemory);
}
Würde nicht die 'ConcurrentStack
@codesparkle wenn es eine blockierende 'Pop'-Methode hätte, vielleicht; aber das tut es nicht. Es hat nur "hol mir etwas, wenn etwas da ist", aka 'Trypop' –
Das hat es für mich dank bro :); –
how is that possible the stack is full & has 16 items??!
In Multithreading-Umgebung ist es sehr viel möglich.
Verwenden Sie mehr als einen Thread in Ihrem Programm? Wenn ja, sollte SharedMemory
lock
ed sein, bevor Sie Änderungen daran vornehmen.
... und bevor Sie es abfragen! –
Wenn SharedMemory
ein Stack
ist, und Sie Multithreading verwenden und wenn Sie auf .Net 4 sind. Sie sollten verwenden: ConcurrentStack
bearbeiten
Nach meiner ersten Bearbeitung und einem großen Kommentar von Quartermeister dies eine einfachere Arbeitslösung:
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);
'ConcurrentStack <>' hat nur 'TryPop', also wenn es (wie in der Frage) ein Blocking-Pop Setup sein soll, wird es durch die Verwendung dieser API nicht einfacher. –
@MarcGravell nicht das Blockieren-Pop sehen :) – MBen
@MarcGravell noch, ist es nicht besser, den Code mit ConcurrentStack zu vereinfachen? – MBen
Sie diesen Multithreading mit Tags versehen haben, um diesen Code Ich vermute, viele Threads zugreifen. Ich rate auch, dass 'SharedMemory' nicht Thread-sicher ist, und dass Sie es nicht sperren. habe ich recht? – Rotem
Was ist 'SharedMemory' in diesem Kontext? und was ist "voll"? –
Der Titel Ihrer Frage lautet "Stapel leer", Ihr erster Satz lautet "Stapel voll". Was ist hier wahr? –