2011-02-16 5 views
19

대기열에 항목이 없으면 ConcurrentQueue의 TryDequeue가 false를 반환합니다.ConcurrentQueue에서 Dequeue 시도

대기열이 비어 있으면 대기열에 새 항목이 추가 될 때까지 기다릴 것이고 새 대기열을 대기열에서 제거하고 그 과정이 계속 진행될 필요가 있습니다.

내가 monitor.enter를 사용하는 경우, 잠깐 펄스 또는 C# 4.0

+1

hmmm - 이것은 이것이 편리하게 노출되지 않는다는 것을 놀라게합니다. 일반적인 사용 사례처럼 보입니다. –

+0

4.0으로 BCL 클래스가이를 노출해야한다고 생각하지만, answer] (http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228), TryDequeue는 아이템이있을 때까지 블로킹합니다 ('true'를 리턴합니다).) * or * 큐가 비어 있고 명시 적으로 종료되었습니다 (false를 반환) –

+0

큐가 비어 있으면 새 항목이 큐에 추가 될 때까지 대기하고 새 큐를 큐에서 제거하고 프로세스가 그런 식으로 계속됩니다. –

답변

41

BlockingCollection은 무엇을 위해 설계 되었습니까?

제가 알고 있듯이 ConcurrentQueue를이 중 하나로 포장 한 다음 Take으로 전화 할 수 있습니다.

0

에서 더 좋은 옵션이 주기적으로 요소의 개수가 0보다 클 때, 당신이 줄 큐 및 요소의 수를 확인할 수 있습니다 신호를 사용하여 예 ManualResetEvent는 대기열이 비어있을 때까지 요소를 대기열에서 제외합니다.

확인 스레드 :

while(true) 
{ 
    int QueueLength = 0; 
    lock(Queue) 
    { 
    queueLength = Queue.Length; 
    } 

    if (Queue.Length > 0) 
    { 
    manualResetEvent.Set(); 
    } 
    else 
    { 
    Thread.Sleep(...); 
    }  
}  

큐에서 스레드 :

while(true) 
{ 
    if(manualResetEvent.WaitOne(timeout)) 
    { 
    DequeueUntilQueueEmpty(); 
    } 
} 

이 역시 DequeueUntilQueueEmpty에 잠금 장치를 사용하는 것을 고려 여기

이 대한 의사 코드입니다.

+0

실제로 Monitor.enter, wait, pulseall을 사용하여 스레드를 대기 및 신호로 만듭니다. ManualResetEvent가 더 나은 옵션입니까? –

+0

사실 저는 Monitor.enter, wait, pulseall을 사용하여 스레드 대기 및 신호를 만듭니다. ManualResetEvent가 더 나은 옵션입니까? –

+0

ManualResetEvent는 간단한 옵션이며 Monitor는 무거운 옵션입니다. –