C# .NET HttpClient.PostAsync()在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

我使用.NET 4.5 HttpClient类多次向服务器发出POST请求。前3个调用运行得很快,但第四次调用
等待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