Bina barisan penyekatan keselamatan benang dalam .net
batasan pelaksanaan sedia ada
kaedah penambahbaikan
Dalam versi yang lebih baik ini, operasi giliran perlindungan
<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>
digunakan untuk menyekat dan mengangkat benang menyekat mengikut status barisan. Di samping itu, kaedah dan lock
ditambah kepada penutupan elegan barisan, dan kaedah Monitor
digunakan untuk mengendalikan barisan sebagai kosong. closing
Close()
Pertimbangan lanjut TryDequeue()
Atas ialah kandungan terperinci Bagaimana untuk merancang barisan menghalang benang di .net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!