2014-01-12 2 views
1

Я пишу инструмент, который отправляет запросы в лазурную таблицу, количество запросов зависит от пользователя. Я хочу отправлять запросы параллельно, но только до определенного числа (я не хочу сразу отправлять все 100 запросов). Есть ли какой-либо встроенный механизм, который я могу использовать для отправки, каждый раз сказывается до 20 запросов?Как ограничить Parallel.foreach для асинхронных операций?

Я знаю, что есть Parallel.ForEach, который может быть ограничен с помощью ParallelOptions.MaxDegreeOfParallelism но для асинхронных операций, как у меня это будет просто посылать все запросы очень быстро, и мой инструмент будет обрабатывать все 100 обратные вызовы одновременно.

+0

Почему ограничение MaxDegreeOfParallelism не работает для вас? Почему вы буксируете запросы - знаете ли вы, что служба не может обработать их все? как вы потребляете услугу? обычно он предоставляет вам встроенные механизмы для обработки асинхронного ввода-вывода – Vitaliy

ответ

3

Вы должны использовать SemaphoreSlim. Это особенно приятно в случае асинхронных операций, потому что у него есть WaitAsync, который возвращает задачу, которую вы можете сделать await. Первые 20 пройдут прямо, а остальные будут асинхронно ждать завершения операции, чтобы они могли начать.

SemaphoreSlim _semaphore = new SemaphoreSlim(20); 

async Task DoSomethingAsync() 
{ 
    await _semaphore.WaitAsync(); 
    try 
    { 
     // possibly async operations limited to 20 
    } 
    finally 
    { 
     _semaphore.Release(); 
    } 
} 

Использование:

for(int i=0; i < 100; i++) 
{ 
    await DoSomethingAsync(); 
} 
Смежные вопросы