问题描述
我需要使用代理下载论坛。我的代码的问题在于它仅占用了我的互联网带宽的10%。另外,我已经读到我需要使用一个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;
}
每次调用FetchAsync
都会将HttpClient
与WebProxy
一起创建或重用。
public static async Task<IFetchResult> FetchAsync(this Url url,FetchContext context)
{
var httpClient = context.ProxyPool.Rent();
var result = await url.FetchAsync(httpClient,context.Observer,context.Delay,context.isReloadWithCookie);
context.ProxyPool.Return(httpClient);
return result;
}
public HttpClient Rent()
{
lock(_lockObject)
{
if (_uninitiliazedDatacenterProxiesAddresses.Count != 0)
{
var proxyAddress = _uninitiliazedDatacenterProxiesAddresses.Pop();
return proxyAddress.GetWebProxy(DataCenterProxiesCredentials).GetHttpClient();
}
return _proxiesQueue.Dequeue();
}
}
我是软件开发的新手,但是异步使用数百或数千个代理进行下载的任务看起来像一个琐碎的任务,许多人应该面对并找到正确的方法来完成它。到目前为止,我无法在互联网上找到解决问题的任何解决方案。关于如何实现最大下载速度有什么想法?
解决方法
让我们看看这里发生了什么:
enabled
在继续下一个项目之前,您实际上是unfocused
ing 。这就是为什么它是异步的而不是并行编程的原因。 async in Microsoft docs
神奇的关键字是await关键字。它将控制权交给执行等待的方法的调用者,最终允许UI响应或服务具有弹性。
从本质上讲,它释放了调用线程来做其他事情 ,但是原始调用代码被暂停执行,直到IO操作完成为止。
现在遇到了问题:
- 您可以在这里使用这种出色的解决方案:foreach async
- 您可以使用Parallel库在不同的线程中执行代码。
var result = await url.FetchAsync(httpClient,context.Observer,context.Delay,context.isReloadWithCookie);