.NET HttpClient.PostAsync() 在 3 个请求后变慢
.NET HttpClient.PostAsync() slow after 3 requests
我正在使用 .NET 4.5 HttpClient class 多次向服务器发出 POST 请求。前 3 次调用 运行 很快,但第四次调用 await client.PostAsync(...)
时,在返回预期响应之前挂起几秒钟。
using (HttpClient client = new HttpClient())
{
// Prepare query
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.Append("?arg=value");
// Send query
using (var result = await client.PostAsync(BaseUrl + queryBuilder.ToString(),
new StreamContent(streamData)))
{
Stream stream = await result.Content.ReadAsStreamAsync();
return new MyResult(stream);
}
}
服务器代码如下:
HttpListener listener;
void Run()
{
listener.Start();
ThreadPool.QueueUserWorkItem((o) =>
{
while (listener.IsListening)
{
ThreadPool.QueueUserWorkItem((c) =>
{
var context = c as HttpListenerContext;
try
{
// Handle request
}
finally
{
// Always close the stream
context.Response.OutputStream.Close();
}
}, listener.GetContext());
}
});
}
在// Handle request
处插入调试语句表明服务器代码似乎并没有在请求发送后立即收到。
我已经调查了是否可能是客户端没有关闭响应的问题,这意味着可以达到 ServicePoint 提供程序允许的连接数。但是,我尝试增加 ServicePointManager.MaxServicePoints
但这根本没有效果。
我也发现了这个类似的问题:
我不认为这是我的代码的问题 - 即使将我的代码完全更改为那里给出的内容也没有解决问题。
问题是有太多 Task
个实例被安排到 运行。
更改我的程序中的一些 Task.Factory.StartNew
调用,以便 运行 长时间使用 TaskCreationOptions.LongRunning
选项解决此问题。似乎任务计划程序在将请求安排到服务器之前正在等待其他任务完成。
我正在使用 .NET 4.5 HttpClient class 多次向服务器发出 POST 请求。前 3 次调用 运行 很快,但第四次调用 await client.PostAsync(...)
时,在返回预期响应之前挂起几秒钟。
using (HttpClient client = new HttpClient())
{
// Prepare query
StringBuilder queryBuilder = new StringBuilder();
queryBuilder.Append("?arg=value");
// Send query
using (var result = await client.PostAsync(BaseUrl + queryBuilder.ToString(),
new StreamContent(streamData)))
{
Stream stream = await result.Content.ReadAsStreamAsync();
return new MyResult(stream);
}
}
服务器代码如下:
HttpListener listener;
void Run()
{
listener.Start();
ThreadPool.QueueUserWorkItem((o) =>
{
while (listener.IsListening)
{
ThreadPool.QueueUserWorkItem((c) =>
{
var context = c as HttpListenerContext;
try
{
// Handle request
}
finally
{
// Always close the stream
context.Response.OutputStream.Close();
}
}, listener.GetContext());
}
});
}
在// Handle request
处插入调试语句表明服务器代码似乎并没有在请求发送后立即收到。
我已经调查了是否可能是客户端没有关闭响应的问题,这意味着可以达到 ServicePoint 提供程序允许的连接数。但是,我尝试增加 ServicePointManager.MaxServicePoints
但这根本没有效果。
我也发现了这个类似的问题:
我不认为这是我的代码的问题 - 即使将我的代码完全更改为那里给出的内容也没有解决问题。
问题是有太多 Task
个实例被安排到 运行。
更改我的程序中的一些 Task.Factory.StartNew
调用,以便 运行 长时间使用 TaskCreationOptions.LongRunning
选项解决此问题。似乎任务计划程序在将请求安排到服务器之前正在等待其他任务完成。