2015-05-14 5 views
2

Я использую Winforms и таргетинг .Net 4.5Как повторно повторять параллельную очередь?

Я хочу перебирать параллельную очередь до тех пор, пока у нее есть элементы. В моем приложении пользователь может добавлять и удалять элементы в параллельную очередь в любой момент.

Пример кода:

ConcurrentQueue<string> cq = new ConcurrentQueue<string>(); 

cq.Enqueue("First"); 
cq.Enqueue("Second"); 
cq.Enqueue("Third"); 
cq.Enqueue("Fourth"); 
cq.Enqueue("Fifth"); 

private void someMethod(string) 
{ 
    //do stuff 
} 

while (!cq.IsEmpty) 
{ 
    //how do I do the code below in a loop? 

    //inner loop starts here 
    someMethod(current cq item); 
    //move to the next item 
    someMethod(the next cq item); 
    //move to the next item 
    someMethod(the next cq item); 
    . 
    . 
    . 
    //if last item is reached, start from the top 

} 

Имейте в виду, что пользователь приложения может добавлять или удалять элементы из очереди в любое время, даже когда цикл, пока работает.

+0

Что произойдет, если предположим, что ваш параллельный вызов пуст (все предметы расходуются), а новый элемент добавлен? Должно ли оно потребляться автоматически по вашим требованиям? – Michael

+0

Я даже не думал об этом далеко, но да. Возможно, я смогу решить это с помощью таймера, который проверяет, имеет ли коллекция элементы, и если это так, запустите цикл, если он еще не запущен. –

ответ

2

Вы должны обертывать очередь в BlockingCollection (а затем напрямую не обращаться к базовой очереди), чтобы иметь поточную безопасную очередь, которая позволяет подождать (блокировать) для элемента, который станет доступным. Если у вас есть это, вы можете использовать GetConsumingEnumerable(), если хотите перебрать элементы для обработки или просто вызвать Take для каждого элемента, который вы хотите.