Управление количеством потоков при использовании c # 5 async / await - PullRequest
0 голосов
/ 22 декабря 2011

Я изучаю использование новых клавиш async / await в c # 5 и читаю эту статью

вижу следующий пример

async void ArchiveDocuments(List<Url> urls)
{
  Task archive = null;
  for(int i = 0; i < urls.Count; ++i)
  {
    var document = await FetchAsync(urls[i]);
    if (archive != null)
      await archive;
    archive = ArchiveAsync(document);
  }
}

Предположительно, если список URL-адресов ОЧЕНЬ длинный, мы можем оказаться в ситуации, когда конус потока выходит из-под контроля.

Что я хотел бы знать, так это рекомендуемый способ контроля количества используемых потоков. Есть ли способ указать пул потоков или максимальное число?

С TPL вы можете использовать опции для контроля максимального количества потоков ParallelOptions.MaxDegreeOfParallelism. Возможно, какой-то способ объединения await и Task будет возможен.

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Цель этого примера - показать паттерн "конвейер", в котором одновременно выполняется не более одной выборки и одного архива.

async не означает одновременный, это означает неблокирование.

0 голосов
/ 22 декабря 2011

Ключевые слова async и await сами по себе не создают никаких потоков. Это полностью зависит от метода, который обрабатывает саму задачу.

На самом деле, такие операции, как ввод-вывод файловой системы или сетевые подключения, обычно не требуют каких-либо потоков для асинхронной работы. Аппаратное обеспечение выполняет то же, что и аппаратное обеспечение, и когда это происходит, происходит соответствующее событие (обратно в C #).

Если вы хотите контролировать количество потоков, вам нужно изменить метод создания потоков - и он не имеет ничего общего с async и awaits.

...