【发布时间】:2016-05-20 11:27:53
【问题描述】:
我有一个我想使用HttpClient 同时下载的页面的 URL 列表。 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的使用,几乎同时创建了一大堆Task。似乎如果 URL 列表足够大,很多任务都会超时(我收到 “A Task was cancelled” 异常)。
所以,我认为应该有一种方法,也许使用某种调度程序来限制并发任务的数量,在给定的时间不允许超过 5 或 6 个。
这样我就可以获得并发下载,而不会像现在那样启动太多可能会停止的任务。
如何做到这一点,这样我就不会因为大量超时任务而饱和?
【问题讨论】:
-
您可能需要考虑使用DataFlow API。
-
你能用我的代码集成它吗?我忽略了如何使用 DataFlow 来做到这一点。 TBH,我从未使用过它,但看看一些样本会有很大帮助。
标签: c# .net concurrency system.reactive reactive-programming