.NET HttpClient.PostAsync()在3次请求后变慢

时间:2015-02-07 16:21:37

标签: c# .net httpwebrequest

我使用.NET 4.5 HttpClient类多次向服务器发出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,但这根本没有效果。

我也发现了类似的问题:

.NET HttpClient hangs after several requests (unless Fiddler is active)

我不相信这是我的代码的问题 - 甚至将我的代码更改为完全没有解决问题的代码。

1 个答案:

答案 0 :(得分:0)

问题在于计划运行的Task个实例太多了。

更改我的程序中的一些Task.Factory.StartNew调用,以查找运行了很长时间的任务,以使用TaskCreationOptions.LongRunning选项修复此问题。在调度请求到服务器之前,任务调度程序似乎正在等待其他任务完成。