我有一个URL列表,想要使用HttpClient
并发下载这些网页。URL列表可能很大(100个或更多!)
我目前有以下代码:
var urls = new List<string>
{
@"http:\\www.amazon.com",
@"http:\\www.bing.com",
@"http:\\www.facebook.com",
@"http:\\www.twitter.com",
@"http:\\www.google.com"
};
var client = new HttpClient();
var contents = urls
.ToObservable()
.SelectMany(uri => client.GetStringAsync(new Uri(uri, UriKind.Absolute)));
contents.Subscribe(Console.WriteLine);
问题:由于使用了 SelectMany,几乎同时创建了一大堆任务。如果 URL 列表足够大,则许多任务会超时(我得到了“一个任务已取消”的异常)。因此,我认为应该有一种方法,可以使用某种类型的调度程序来限制并发任务的数量,不允许在给定时间内超过 5 或 6 个。这样,我就可以获得并发下载,而不启动太多可能会停顿的任务,就像它们现在所做的那样。如何做到这一点,以免饱和出现大量超时任务?