C# 多个带有代理的HttpClient,试图实现最大下载速度
我需要使用代理下载一个论坛。我的代码的问题是,它只占用我互联网带宽的10%。我还读到,我需要使用一个C# 多个带有代理的HttpClient,试图实现最大下载速度,c#,asynchronous,web-scraping,httpclient,tpl-dataflow,C#,Asynchronous,Web Scraping,Httpclient,Tpl Dataflow,我需要使用代理下载一个论坛。我的代码的问题是,它只占用我互联网带宽的10%。我还读到,我需要使用一个HttpClient实例,但对于多个代理,我不知道如何做到这一点。更改MaxDegreeOfParallelism不会更改任何内容 public static IAsyncEnumerable<IFetchResult> FetchInParallelAsync( this IEnumerable<Url> urls, FetchContext context) {
HttpClient
实例,但对于多个代理,我不知道如何做到这一点。更改MaxDegreeOfParallelism
不会更改任何内容
public static IAsyncEnumerable<IFetchResult> FetchInParallelAsync(
this IEnumerable<Url> urls, FetchContext context)
{
var fetchBlcock = new TransformBlock<Url, IFetchResult>(
transform: url => url.FetchAsync(context),
dataflowBlockOptions: new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 128
}
);
foreach(var url in urls)
fetchBlcock.Post(url);
fetchBlcock.Complete();
var result = fetchBlcock.ToAsyncEnumerable();
return result;
}
我是软件开发的新手,但使用数百或数千个代理异步下载的任务看起来像是一项琐碎的任务,许多人都应该面对并找到正确的方法来完成。到目前为止,我无法在互联网上找到任何解决问题的方法。关于如何实现最大下载速度有什么想法吗?让我们看看这里发生了什么:
var result = await url.FetchAsync(httpClient, context.Observer, context.Delay, context.isReloadWithCookie);
实际上,您正在等待ing,然后再继续下一项。这就是为什么它是异步的,而不是并行编程
等待关键字是魔术发生的地方。它将控制权交给wait执行的方法的调用者,并最终允许UI具有响应性或服务具有弹性
本质上,它释放了调用线程来做其他事情,但是在IO操作完成之前,原始调用代码被暂停执行
现在谈谈你的问题:
看看这个:
.ConfigureAwait(false)代码>检查这是否有助于添加到等待url.FetchAsync(httpClient、context.Observer、context.Delay、context.isReloadWithCookie)的末尾
AthanasiosPost
ing到数据流块实际上是瞬时的。不需要将它与<代码>并行化。对于。我把我的答案主要用于代码块>支持延迟消息的目标块,或者对于在其后实现中可能进行更多处理的块,考虑使用sEntAsNyc,它将立即返回推断它不是瞬时的。不过,我并不是真正的数据流专家,所以这只是一个建议。Post
方法立即返回,返回值指示消息是否被接受。SendAsync
方法也会立即返回,返回值是一个任务
,当数据流块明确接受或拒绝消息时,该任务完成。两者之间的区别在于延期。Post
将延迟的
响应解释为不被接受,而SendAsync
将其解释为以后可能实现的承诺,并返回未完成的任务。实际上,您需要将sendascent
与配置了BoundedCapacity
的块一起使用。
var result = await url.FetchAsync(httpClient, context.Observer, context.Delay, context.isReloadWithCookie);
Parallel.For(0, urls.Count,
index => fetchBlcock.Post(urls[index])
});