Асинхронные задачи C# в очереди или списке ожидания

у меня есть асинхронная задача, как это:

public async Task DoWork()
{

}

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

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

где я добавляю задачи.

Я начинаю задачи следующим образом:

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

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

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

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

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

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

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

1 ответов


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

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

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

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