C# 多个带有代理的HttpClient,试图实现最大下载速度

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) {

我需要使用代理下载一个论坛。我的代码的问题是,它只占用我互联网带宽的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;
}

我是软件开发的新手,但使用数百或数千个代理异步下载的任务看起来像是一项琐碎的任务,许多人都应该面对并找到正确的方法来完成。到目前为止,我无法在互联网上找到任何解决问题的方法。关于如何实现最大下载速度有什么想法吗?

让我们看看这里发生了什么:

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)的末尾
    Athanasios
    Post
    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])
    });