You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6多代理(同端口异凭据)并发连接超时问题求助

问题分析与解决方案

核心问题点

  • 无限制创建线程:循环中为每个代理新建Thread,当代理数量超过阈值后,系统线程资源被耗尽,上下文切换开销剧增,所有连接都无法及时得到处理,最终超时。
  • HttpClient/HttpClientHandler重复创建:每个线程都实例化这两个对象,HttpClient设计为可复用的单例/静态对象,频繁创建会导致大量套接字处于TIME_WAIT状态,耗尽本地端口资源,同时增加GC压力。
  • 同步阻塞异步方法:用GetAwaiter().GetResult()同步等待异步请求,导致线程被阻塞,进一步浪费线程资源,无法发挥异步IO的优势。
  • ConnectionClose强制关闭连接:设置为true会禁用HTTP持久连接,每次请求都要重新建立TCP连接,高并发下握手开销指数级增长,加剧资源消耗。
  • 代理服务器并发限制:同一代理主机端口,即使凭据不同,代理服务端通常会对单IP的并发连接数做限制,超过阈值后会拒绝新连接,导致所有请求超时。

改进后的代码示例

复用HttpClient与异步并发

// 全局复用HttpClientHandler和HttpClient(静态初始化)
private static readonly HttpClientHandler _sharedHandler = new HttpClientHandler
{
    MaxConnectionsPerServer = 100, // 根据代理服务器实际能力调整,无需设为100000
    UseProxy = true
};

private static readonly HttpClient _sharedClient = new HttpClient(_sharedHandler)
{
    Timeout = TimeSpan.FromMilliseconds(5000)
};

// 测试代理的异步方法
private async Task TestProxyAsync(IWebProxy proxy)
{
    try
    {
        _sharedHandler.Proxy = proxy;
        // 移除ConnectionClose,默认启用持久连接
        var read = await _sharedClient.GetStringAsync("http://ip-api.com/json");
        // 处理返回结果
        Console.WriteLine($"代理 {proxy.GetProxy(new Uri("http://ip-api.com/json"))} 连接成功");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"代理 {proxy.GetProxy(new Uri("http://ip-api.com/json"))} 失败:{ex.Message}");
    }
}

// 主线程调用
private async Task RunTestsAsync(List<IWebProxy> proxys)
{
    // 控制并发数,避免超过代理服务器限制
    var semaphore = new SemaphoreSlim(15); // 设为代理允许的并发数,比如15
    var tasks = new List<Task>();

    foreach (var proxy in proxys)
    {
        await semaphore.WaitAsync();
        tasks.Add(Task.Run(async () =>
        {
            try
            {
                await TestProxyAsync(proxy);
            }
            finally
            {
                semaphore.Release();
            }
        }));
    }

    await Task.WhenAll(tasks);
}

额外优化建议

  • 控制并发数:用SemaphoreSlim限制同时发起的请求数,匹配代理服务器的并发上限,避免触发服务端的限流机制。
  • 复用代理连接:同一代理主机端口的不同凭据,可尝试复用底层连接(需确认代理支持凭据切换),减少连接建立开销。
  • 检查代理服务器配置:联系代理服务商确认单IP的并发连接限制,调整本地并发数与之匹配。
  • 避免同步阻塞:全程使用异步编程模型(async/await),最大化利用IO线程,减少资源占用。

内容的提问来源于stack exchange,提问作者user22320384

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:15:10