1

我正在研究在 c#5 中使用新的 async/await 密钥并阅读这篇文章

我看到下面的例子

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 的方式是可能的。

4

2 回答 2

1

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

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

于 2011-12-22T11:24:04.777 回答
0

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

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

async如果你想控制线程的数量,你需要改变创建线程的方法——它与and无关awaits

于 2011-12-22T12:14:51.927 回答