我有一个我想要使用HttpClient
并发下载的页面的URL列表。 URL列表可能很大(100以上!)使用Rx和SelectMany限制并发请求
目前我已经有这样的代码:
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个任务。
通过这种方式,我可以获得并发下载,而无需启动太多可能会失速的任务,就像他们现在所做的那样。
如何做到这一点,所以我不饱和大量的超时任务?
非常感谢。
你可能要考虑使用[数据流](https://msdn.microsoft.com/en-us/library/hh228603%28v= vs.110%29.aspx)API。 –
你可以使用我的代码来整合它吗?我忽略了如何使用DataFlow来完成它。 TBH,我从来没有用过,但看一些样品会有很大的帮助。 – SuperJMN