如何优化C#程序HTTP请求发送速度 降低Minecraft抢名请求耗时
Minecraft名称抢注工具请求提速方案
你当前代码请求间隔过大的核心原因是发送逻辑完全串行:循环内使用await等待上一个请求完整返回响应后,才会发起下一个请求,从测试结果看首次请求后间隔达到数百毫秒,完全没有利用并发能力。
具体优化手段
- 解除串行等待,实现请求流水线发送
发送循环内不要await请求任务,发起请求后立刻进入下一轮循环发送新请求,响应处理逻辑异步执行即可,不要阻塞发送流程。注意不要在发送路径上放置控制台同步输出、响应内容读取等耗时操作。 - 放开HttpClient内置连接限制
.NET运行时默认对单域名的并发TCP连接数限制为2,必须手动放开:- 初始化HttpClient前将
ServicePointManager.DefaultConnectionLimit设置为50~100,或者使用SocketsHttpHandler初始化HttpClient,直接设置MaxConnectionsPerServer属性为目标并发值 - 关闭默认代理自动探测:初始化Handler时将
UseProxy设为false,避免系统代理检测带来的数百毫秒额外延迟 - 开启HTTP长连接复用,设置
request.Headers.ConnectionClose = false,复用已建立的TCP连接
- 初始化HttpClient前将
- 提前预热连接,消除握手开销
首次请求到Mojang接口需要完成TCP三次握手、TLS协商,会产生数百毫秒冷启动延迟。在抢注时间点到达前10~30秒,提前向目标接口发起数个预热请求,将长连接预建到连接池内,到点直接复用连接发送请求即可。 - 优化等待逻辑精度
你当前使用的Thread.Sleep默认在Windows上只有15.6ms的时钟精度,很容易出现时间偏移。可以在等待阶段先使用Sleep等待到距目标时间差10~20ms的节点,再用高精度自旋等待卡准发送时间点,避免触发时机偏移。 - 分离发送与响应处理流程
所有发出去的请求任务统一存入一个并发集合,单独开一个后台异步任务轮询集合内的任务状态,收到响应后再输出状态码、判断是否抢注成功,彻底避免响应处理阻塞发送流程。
核心优化代码示例
// 初始化HttpClient时提前放开限制 public static Client InitClient() { var handler = new SocketsHttpHandler() { MaxConnectionsPerServer = 50, UseProxy = false, PooledConnectionLifetime = TimeSpan.FromMinutes(5) }; return new Client(handler); } // 主逻辑部分修改 var sendTasks = new List<Task>(); var client = InitClient(); // 提前预热连接 for(int i=0;i<3;i++) _ = client.Put(name); Thread.Sleep(droptime - offset - 20); // 最后20ms自旋等待卡准时间 var targetTime = epoch - offset; while(DateTimeOffset.Now.ToUnixTimeMilliseconds() < targetTime) { } // 开始并发发送 while (true) { var sent = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 不await,把任务丢出去直接发下一个 var task = client.Put(name); sendTasks.Add(task); Console.Write($" Sent: + {sent}"); // 控制发送速率避免被限流 Thread.SpinWait(1000); } // 单独开后台任务处理响应 _ = Task.Run(async () => { while(true) { var completed = sendTasks.Where(t => t.IsCompleted).ToList(); foreach(var t in completed) { sendTasks.Remove(t); // 处理响应结果,判断是否抢注成功 } await Task.Delay(10); } });
注意:不要无限制拉高并发,过高的请求频率会触发Mojang API的限流规则导致IP被临时封禁,建议将并发控制在10~30区间即可。
内容的提问来源于stack exchange,提问作者hud Kad
相关产品推荐
相关产品推荐

