Konstruieren Sie eine Thread -Sicherheitsblockierungswarteschlange im .NET
Die Einschränkungen der vorhandenen Implementierung
Verbesserungsmethode
In dieser verbesserten Version, der Vorgangsvorgang der Satzschutzwarteschlange, um die Sicherheit der Gewinne zu gewährleisten.
<code class="language-csharp">class SizeQueue<T> { private readonly Queue<T> queue = new Queue<T>(); private readonly int maxSize; private bool closing; // 添加关闭标志 public SizeQueue(int maxSize) { this.maxSize = maxSize; } public void Enqueue(T item) { lock (queue) { while (queue.Count >= maxSize && !closing) // 检查关闭标志 { Monitor.Wait(queue); } if(closing) return; // 如果队列已关闭,则直接返回 queue.Enqueue(item); if (queue.Count == 1) { Monitor.PulseAll(queue); } } } public T Dequeue() { lock (queue) { while (queue.Count == 0 && !closing) // 检查关闭标志 { Monitor.Wait(queue); } if(closing && queue.Count == 0) throw new InvalidOperationException("Queue is closed and empty."); // 队列关闭且为空 T item = queue.Dequeue(); if (queue.Count == maxSize - 1) { Monitor.PulseAll(queue); } return item; } } public void Close() { lock (queue) { closing = true; Monitor.PulseAll(queue); } } public bool TryDequeue(out T value) { lock (queue) { while (queue.Count == 0) { if (closing) { value = default(T); return false; } Monitor.Wait(queue); } value = queue.Dequeue(); if (queue.Count == maxSize - 1) { Monitor.PulseAll(queue); } return true; } } }</code>
dem eleganten Verschluss der Warteschlange hinzugefügt, und die lock
-Methode wird verwendet, um die Warteschlange als leer zu handhaben. Monitor
closing
Weitere Überlegung Close()
TryDequeue()
Für tatsächliche Anwendungen muss möglicherweise die Situation umgehen, in der die Warteschlange geschlossen ist oder die Notwendigkeit einer Eleganz benötigt wird. Aus diesem Grund kann der Code wie folgt geändert werden (wie oben gezeigt).
Das obige ist der detaillierte Inhalt vonWie gestalte ich eine thread-safe Blockierwarteschlange in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!