当前位置: 首页 > 编程语言 > C#

使用Rx和SelectMany限制并发请求分享

时间:2023-04-10 15:19:59 C#

使用Rx和SelectMany限制并发请求URL列表可能很大(100或更多!)我目前有这段代码:varurls=newList{@"http:\www.amazon.com",@"http:\www.bing.com",@"http:\www.facebook.com",@"http:\www.twitter.com",@"http:\www.google.com"};varclient=newHttpClient();varcontents=urls.ToObservable().SelectMany(uri=>client.GetStringAsync(newUri(uri,UriKind.Absolute)));contents.Subscribe(Console.WriteLine);问题是:由于使用了SelectMany,几乎同时创建了大量任务。似乎如果URL列表足够大,许多任务都会超时(我得到“任务取消”异常)。所以我认为应该有一种方法,也许使用某种调度程序,来限制并发任务的数量,在给定时间不允许超过5或6个。通过这种方式,我可以获得并发下载,而无需启动太多可能会停止的任务,就像他们现在所做的那样。我怎样才能做到这一点,这样我就不会被大量的超时任务搞得筋疲力尽?非常感谢。请记住,SelectMany()实际上是Select().Merge()。SelectMany没有maxConcurrent参数,而Merge()有maxConcurrent。所以你可以使用它。从您的示例中,您可以执行以下操作:varurls=newList{@"http:\www.amazon.com",@"http:\www.bing.com",@"http:\www.facebook.com",@"http:\www.twitter.com",@"http:\www.google.com"};varclient=newHttpClient();varcontents=urls.ToObservable().Select(uri=>Observable.FromAsync(()=>client.GetStringAsync(uri))).Merge(2);//2最大并发请求!contents.Subscribe(Console.WriteLine);以下是如何使用DataFlowAPI执行此操作的示例:privatestaticTaskDoIt(){varurls=newList{@"http:\www.amazon.com",@"http:\www.bing.com",@"http:\www.facebook.com",@"http:\www.twitter.com",@"http:\www.google.com"};varclient=newHttpClient();//创建一个以URL作为输入的块//并产生下载结果作为输出大多数2个下载操作同时执行MaxDegreeOfParallelism=2});//创建一个打印出结果的块ActionBlockdoneBlock=newActionBlock(x=>Console.WriteLine(x));//将第一个块的输出链接到第二个块的输入downloadBlock.LinkTo(doneBlock,newDataflowLinkOptions{PropagateCompletion=true});//将url输入到第一个块中foreach(varurlinurls){downloadBlock.Post(url);}downloadBlock.Complete();//标记输入完成//允许消费者等待整个操作完成returndoneBlock.Completion;}staticvoidMain(string[]args){DoIt().Wait();Console.WriteLine("完成");控制台.ReadLine();你可以看到这很有用吗?以上就是C#学习教程的全部内容:使用Rx和SelectMany限制并发请求分享。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——varurls=newList{@"http:\www.amazon.com",@"http:\www.bing.com",@"http:\www.google.com",@"http:\www.twitter.com",@"http:\www.google.com"};varcontents=urls.ToObservable().SelectMany(uri=>Observable.Using(()=>newSystem.Net.Http.HttpClient(),c客户端=>客户端.GetStringAsync(newUri(uri,UriKind.Absolute)).ToObservable()));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: