In der Szene, in der gleichzeitig auf Multi -Thread -Zugriffs -Warteschlangen zugegriffen werden, ist die Größe der Kontrollwarteschlange entscheidend, um das unendliche Wachstum der Warteschlange zu verhindern. In diesem Artikel wird die Methode zum Erstellen einer benutzerdefinierten Blockierungswarteschlange im .NET erörtert.
Eine einfache Lösung besteht darin, die Sammlung als Grundlage der Warteschlange zu verwenden und
(_fullevent) zu verwenden, um den zusätzlichen Thread zu blockieren, wenn die Warteschlange das angegebene Maximum (maxSize) erreicht. Beim Entfernen des Projekts wird ein _fullevent -Signal ausgestellt, um das Team zuzulassen.
AutoResetEvent
Aufgrund der unzureichenden Synchronisation ist die Sicherheit dieser Implementierung jedoch besorgniserregend. Die Verbesserungsmethode besteht darin, den standardisierten Warteschlangentyp zu verwenden und das Synchronelement zu verwenden, um die Management -Obstruktion anzuzeigen.
Der folgende Code zeigt die Implementierung der verbesserten:
Diese Erkenntnis liefert einen Mechanismus, der eine sichere und effiziente Warteschlangengröße durch Verwendung einer gebauten Synchronisationsstruktur bietet. Darüber hinaus enthält es auch die Funktion, die Warteschlange elegant zu schließen, sodass der Leser sauber verlassen kann.
<code class="language-csharp">class SizeQueue<T> { private readonly Queue<T> queue = new Queue<T>(); private readonly int maxSize; public SizeQueue(int maxSize) { this.maxSize = maxSize; } public void Enqueue(T item) { lock (queue) { while (queue.Count >= maxSize) { Monitor.Wait(queue); } queue.Enqueue(item); if (queue.Count == 1) { // 唤醒任何被阻塞的出队操作 Monitor.PulseAll(queue); } } } public T Dequeue() { lock (queue) { while (queue.Count == 0) { Monitor.Wait(queue); } T item = queue.Dequeue(); if (queue.Count == maxSize - 1) { // 唤醒任何被阻塞的入队操作 Monitor.PulseAll(queue); } return item; } } }</code>
Das obige ist der detaillierte Inhalt vonWie implementiere ich eine thread-sichere Blockierungswarteschlange mit Größengrenzen in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!