使用c#5 async / await时控制线程数

时间:2011-12-22 09:30:31

标签: multithreading async-await c#-5.0

我正在考虑在c#5中使用新的async / await键盘并阅读this article

我看到以下示例

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);
  }
}

据推测,如果Urls列表很长,我们可能会陷入线程无法控制的情况。

我想知道的是控制所用线程数的推荐方法。有没有办法指定线程池或最大数量?

使用TPL,您可以使用选项来控制最大线程数 ParallelOptions.MaxDegreeOfParallelism。也许某种方式可以将await和Task结合起来。

2 个答案:

答案 0 :(得分:1)

该示例的要点是显示“管道”模式,其中最多只有一个Fetch和一个Archive同时执行。

async并不意味着并发,它意味着无阻塞。

答案 1 :(得分:0)

asyncawait关键字本身不会创建任何线程。这完全取决于处理任务本身的方法。

实际上,文件系统I / O或网络连接等操作通常不需要任何线程来异步运行。硬件执行硬件的操作,完成后会触发相关事件(返回C#)。

如果要控制线程数,则需要更改创建线程的方法 - 它与asyncawaits无关。