using System; using System.Collections.Generic; using System.Threading; namespace DepthFirstScheduler { /// /// http://blogs.msdn.com/b/toub/archive/2006/04/12/blocking-queues.aspx /// /// 終了を通知するにはnullを投入する手が使える /// /// public class MonitorQueue { private Int32 _count = 0; public Int32 Count { get { return _count; } } private Queue _queue = new Queue(); public T Dequeue() { lock (_queue) { while (_count <= 0) Monitor.Wait(_queue); _count--; return _queue.Dequeue(); } } public void Enqueue(T data) { lock (_queue) { _queue.Enqueue(data); _count++; Monitor.Pulse(_queue); } } } }