我正在考虑在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结合起来。
答案 0 :(得分:1)
该示例的要点是显示“管道”模式,其中最多只有一个Fetch和一个Archive同时执行。
async
并不意味着并发,它意味着无阻塞。
答案 1 :(得分:0)
async
和await
关键字本身不会创建任何线程。这完全取决于处理任务本身的方法。
实际上,文件系统I / O或网络连接等操作通常不需要任何线程来异步运行。硬件执行硬件的操作,完成后会触发相关事件(返回C#)。
如果要控制线程数,则需要更改创建线程的方法 - 它与async
和awaits
无关。