我使用.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)
我不相信这是我的代码的问题 - 甚至将我的代码更改为完全没有解决问题的代码。
答案 0 :(得分:0)
问题在于计划运行的Task
个实例太多了。
更改我的程序中的一些Task.Factory.StartNew
调用,以查找运行了很长时间的任务,以使用TaskCreationOptions.LongRunning
选项修复此问题。在调度请求到服务器之前,任务调度程序似乎正在等待其他任务完成。