Подтвердить что ты не робот

Что такое метод BlockingCollection.TakeFromAny, полезный для

Мне нужно создать очередь блокировки priorty, и моя догадка заключается в том, что TakeFromAny может быть секретным ингредиентом, однако документация по этому методу разрежена. Какова его цель/соответствующее использование /

Мое требование состоит в том, что несколько потоков будут добавляться либо в очередь с высоким приоритетом, либо с низким приоритетом. Один поток будет потреблять эти две очереди, которые всегда берутся из очереди с высоким приоритетом до очереди с низким приоритетом.

Вполне возможно, что ни метод BlockingCollection, ни метод TakeFromAny не будут мне полезны. Если это так, тогда будет оценен указатель в правильном направлении.

4b9b3361

Ответ 1

Вы правы. Документация довольно скудная. Тем не менее, я взглянул на реализацию через Reflector, и я считаю, что вы можете использовать метод BlockingCollection.TakeFromAny для имитации приоритета приоритета, который вы желаете. Причина в том, что в реализации используется метод WaitHandle.WaitAny, который возвращает наименьший индекс для всех сигнализированных объектов. Это означает, что если у вас есть две или более очереди с доступными элементами, всегда будет выбрана очередь, появляющаяся сначала в массиве.

Следующий код должен всегда выводить "высокий".

var low = new BlockingCollection<object> { "low" };
var high = new BlockingCollection<object> { "high" };
var array = new BlockingCollection<object>[] { high, low };
object item;
int index = BlockingCollection<object>.TakeFromAny(array, out item);
Console.WriteLine(item);