2014-01-03 3 views
7

ждущие у меня есть задачи асинхронных вроде этого:C# задачи в асинхронной очереди или список

public async Task DoWork() 
{ 

} 

И у меня есть на данный момент: с

List<Task> tmp = new List<Task>(); 

, где я добавить задачи.

я начинаю такие задачи, как это:

foreach (Task t in tmp) 
{ 
    await t; 
} 

Теперь мой вопрос:

What`s лучший способ, чтобы начать задачи и работать только 3 из них, в то же время (до тех пор, другие ждут)?

Я думаю, мне нужно что-то вроде очереди/списка ожидания?

Также должно быть возможно добавить дополнительные задачи после запуска очереди.

Я использую .NET 4.5.

Спасибо за любые предложения

+0

Пробовать это сообщение может помочь вам [Обработка очереди TPL] (http://stackoverflow.com/questions/14929592/tpl-queue-processing) – Ravi

ответ

17

На самом деле, задачи начать как только вы звоните DoWork; когда вы await их, вы отделка задачи.

Одним из вариантов задач дросселирования является SemaphoreSlim, которые вы можете использовать в качестве таковых:

private SemaphoreSlim _mutex = new SemaphoreSlim(3); 
public async Task DoWorkAsync() 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    ... 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

Другой вариант заключается в использовании фактической очереди, как ActionBlock<T>, который имеет встроенную поддержку дросселирования.

+0

+1 Хорошее решение! – gleng

+0

Ничего себе, спасибо. Отлично работает! Я использую сейчас: SemaphoreSlim – Pumper

+0

Вы также можете рассмотреть возможность использования Reactive Extensions для дросселирования. –

Смежные вопросы