2011-02-16 36 views
19

TryDequeue trong ConcurrentQueue sẽ trả về false nếu không có mục nào trong Hàng đợi.Hãy thử Dequeue trong ConcurrentQueue

Nếu hàng đợi trống, tôi cần hàng đợi của tôi sẽ đợi cho đến khi mục mới được thêm vào hàng đợi và nó sẽ khử hàng mới và quá trình sẽ tiếp tục như thế.

tôi có nên sử dụng Monitor.Enter, chờ đợi, xung hoặc bất kỳ tùy chọn tốt hơn trong C# 4.0

+1

hmmm - nó làm tôi ngạc nhiên rằng điều này không được tiếp xúc thuận tiện - có vẻ như một trường hợp sử dụng phổ biến ... –

+0

Tôi nghĩ rằng với 4.0 một lớp BCL nên phơi bày điều này, nhưng nếu không có gì khác xuất hiện, có lẽ nhìn [tại đây answer] (http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228), trong đó TryDequeue sẽ chặn cho đến khi * hoặc * có một mục (trả về 'true') * hoặc * hàng đợi trống và tắt rõ ràng (trả về 'false') –

+0

Nếu hàng đợi trống, tôi cần Chủ đề của tôi sẽ đợi cho đến khi mục mới được thêm vào hàng đợi và nó sẽ xóa bỏ hàng mới, và quá trình sẽ tiếp tục như thế. –

Trả lời

41

Đây không phải là những gì BlockingCollection được thiết kế cho?

Khi tôi hiểu nó, bạn có thể quấn ConcurrentQueue của bạn với một trong số này, và sau đó gọi Take.

0

Bạn có thể kiểm tra định kỳ số phần tử trong hàng đợi và khi số phần tử là lớn hơn không, bạn đưa ra một tín hiệu sử dụng ví dụ ManualResetEvent vào luồng xóa (các) thành phần cho đến khi hàng đợi rỗng.

Đây là mã giả cho việc này:

Kiểm tra Ðề tài:

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

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

Dequeue Ðề tài:

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

Xem xét sử dụng khóa trong DequeueUntilQueueEmpty, quá.

+0

Trên thực tế im bằng cách sử dụng Monitor.enter, chờ đợi, pulseall để làm cho các chủ đề chờ đợi và tín hiệu. ManualResetEvent có phải là một lựa chọn tốt hơn không? –

+0

Trên thực tế im bằng cách sử dụng Monitor.enter, chờ đợi, pulseall để làm cho các chủ đề chờ đợi và tín hiệu. ManualResetEvent có phải là một lựa chọn tốt hơn không? –

+0

ManualResetEvent là tùy chọn nhẹ, Màn hình là một tùy chọn nặng. –

Các vấn đề liên quan