C# .NET HttpClient.PostAsync()在3次请求后变慢
我使用.NET 4.5 HttpClient类多次向服务器发出POST请求。前3个调用运行得很快,但第四次调用C# .NET HttpClient.PostAsync()在3次请求后变慢,c#,.net,httpwebrequest,C#,.net,Httpwebrequest,我使用.NET 4.5 HttpClient类多次向服务器发出POST请求。前3个调用运行得很快,但第四次调用等待client.PostAsync(…)时,它会挂起几秒钟,然后返回预期的响应 using (HttpClient client = new HttpClient()) { // Prepare query StringBuilder queryBuilder = new StringBuilder(); queryBuilder.Append("?arg=va
等待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.Factory.StartNew
调用更改为使用TaskCreationOptions。LongRunning
选项修复了此问题。任务计划程序似乎正在等待其他任务完成,然后才计划向服务器发送请求。是否尝试设置ServicePointManager.DefaultConnectionLimit
?是的,我尝试将其设置为10,但没有任何效果使用其他服务器(google.com)。问题还在吗?如果你耗尽了线程池限制,你的应用程序就会出现严重问题。修复这个问题,而不是隐藏LongRunning的问题。我的应用程序的一部分是监听各个端口上的连接,因此我有一个线程专门监听每个端口。似乎可以将这些线程的任务更改为长时间运行,因为它们是必需的?您可以这样做。这将是一个稳定的应用程序,因为负载已从池中释放。但是,由于您将异步IO与await一起使用,所以只需将其用于接受。不,我在这里使用的是其他任务,而不是HttpClient