以最大并行度将IEnumerable转换为IObservable我有一系列异步任务要做(例如获取N个网页)。现在我想要的是将它们全部公开为IObservables。我目前的解决方案使用这个问题的答案:asyncTaskGetPage(stringpage){Console.WriteLine("Before");varresult=awaitFetchFromInternet(页面);Console.WriteLine("之后");返回结果;}//pages是一个IEnumerableIObservableresultObservable=pages.Select(GetPage).Select(t=>Observable.FromAsync(()=>t)).Merge();//现在使用列表foreach(ResultObjobjinresultObservable.ToEnumerable()){Console.WriteLine(obj.ToString());}问题是我不知道要获取的页数,它可能很大。我不想同时提出数百个请求。所以我想要一种方法来限制可以并行执行的最大任务数。有没有办法限制对GetPage的并发调用?Merge有一个重载,它接受一个maxConcurrent参数,但它似乎并没有真正限制函数调用的并发性。控制台在After消息之前打印所有Before消息。注意:我需要转换回IEnumerable。我正在为一个系统编写一个数据源,该系统为我提供了从中提取数据的描述符,我需要给它一个下载数据列表。编辑以下应该工作。此重载限制了并发订阅的数量。varresultObservable=pages.Select(p=>Observable.FromAsync(()=>GetPage(p))).Merge(maxConcurrent);说明要了解为什么需要进行此更改,我们需要一些背景知识。FromAsync返回一个observable,每个传递的Func都会在每次订阅时被调用。这意味着如果observable从未被订阅,它就永远不会被调用。Merge急切地读取源序列并且只同时订阅n个observable。通过这两部分,我们可以看出为什么原始版本会并行执行所有内容:由于(2),在Merge决定需要订阅多少可观察的GetPages时,已经为所有源字符串调用了GetPage。我们还可以看到为什么第二个版本有效:即使序列已完全迭代,(1)意味着在Merge决定它需要订阅第n个可观察对象之前不会调用GetPage。这导致了只同时执行n个任务的预期结果。以上就是C#学习教程:IEnumerable转IObservable,最大并行度分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
