Use*_*987 5 c# asp.net request console-application dotnet-httpclient
我制作了一个控制台应用程序,它基本上对我的服务器执行大量请求。每个用户 10-15000 个请求。
所以我编写了使用 .NET 的 HTTP 客户端库的代码:
public async Task<string> DoRequest(string token)
{
var request = new HttpRequestMessage(HttpMethod.Post, "mysite.com");
string requestXML = "my xml request goes her...";
request.Content = new StringContent(requestXML, Encoding.UTF8, "text/xml");
var response = await httpClient.SendAsync(request);
return await response.Content.ReadAsStringAsync();
}
Run Code Online (Sandbox Code Playgroud)
所以现在我尝试每 1 秒执行尽可能多的 HTTP 请求...我不知道这个上限是多少,所以我使用并行 for 循环来加速:
Parallel.For(0,list.Count(),items=>{
DoRequest(item.Token);
});
Run Code Online (Sandbox Code Playgroud)
但我对代码的速度以及请求的发出方式不太满意......
有什么方法可以加快速度,每 1 秒最多可以处理 10-100 个请求?或者最大限制是多少?
有人可以帮我吗 ?
PS,我只创建了一个 httpclient 类的实例,因为我读到,只创建一个实例是一种很好的做法,因为每次创建该类的新对象时,连接都会关闭,这不是我们想要的不是吗?
有什么方法可以加快速度,每 1 秒最多可以处理 10-100 个请求?
这是一个无法回答的问题。
或者说最高限额是多少?
正如大卫指出的,你需要设置ServicePointManager.DefaultConnectionLimit. 这应该足以作为方法中的第一行Main:
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
Run Code Online (Sandbox Code Playgroud)
我使用并行 for 循环来加快速度
对于这项工作来说,这是不正确的工具。您确实需要并发,但不需要并行。异步并发使用以下方式表示Task.WhenAll:
var tasks = list.Select(item => DoRequest(item.Token));
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
我只创建了一个 httpclient 类的实例,因为我读到,只创建一个实例是一种很好的做法,因为每次创建该类的新对象时,连接都会关闭,这不是我们想要的,不是吗?
那是对的。
| 归档时间: |
|
| 查看次数: |
5189 次 |
| 最近记录: |