BlockingQueue




설명


개발을 하다보면, 종종 MessageQueue 같은게 필요합니다. Thead 에 Safe 한 이러한 큐를 Semapore 를 이용하여 간단히 만들어 보았습니다.


Queue 안에 값이 있으면, Dequeue 가 정상적으로 되고, 만약 값이 들어있지 않다면, 새로운 값이 Enqueue 될때까지 block 상태가 됩니다. 이후 값이 들어오면 자동으로 dequeue 가 됩니다.




    [BlockingQueue]


public class BlockingQueue<T>
{
    Queue<T> que = new Queue<T>();
    Semaphore sem = new Semaphore(0, Int32.MaxValue);

    public void Enqueue(T item) {
        lock (que) {
            que.Enqueue(item);
        }
        sem.Release();
    }


    public T Dequeue() {
        sem.WaitOne();
        lock (que) {
            return que.Dequeue();
        }
    }
}