2014-03-31 48 views
0

我具有从多个线程发送HTTP POST一个简单的控制台应用:HttpClient的POST长上IIS请求处理之前延迟,多线程

List<Task> tasks = new List<Task>(); 
for (int i = 0; i < 100; i++) 
{ 
    tasks.Add(Task.Factory.StartNew(() => SendQuery(url1, query1))); 
    tasks.Add(Task.Factory.StartNew(() => SendQuery(url2, query2))); 
} 

Task.WaitAll(tasks.ToArray()); 

SendQuery(string uri, string requestString)看起来像这样:

Uri url = new Uri(uri); 

try 
{ 
    using (HttpClient client = new HttpClient { Timeout = new TimeSpan(0, 0, 10, 0) }) 
    { 
     StringContent content = new StringContent(requestString); 
     content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
     HttpResponseMessage response = client.PostAsync(url, content).Result; 
     response.EnsureSuccessStatusCode(); 
    } 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
} 

程序工作没有任何错误,最后处理所有的查询,但在填写完tasks列表后,每个线程挂在client.PostAsync(url, content).Result之后,几分钟后 IIS开始处理eries。为什么会出现这种延迟?在这段时间发生了什么?我使用在Windows Server 2008 R2上运行的IIS 7.5来托管提供url1url2的网络服务。

+0

传递的HttpClient的一个实例为您SendQuery方法,或HttpClient的实例字段。重用HttpClient实例更有效。 –

+0

如果您将SendQuery方法设置为异步,而不是为每个请求创建一个全新的线程,它也会更加高效。 –

回答

0

在程序开始时将此值设置为500或1000,并让我们知道效果。 (取决于.NET版本),你的请求可能在2默认值越来越节流

ServicePointManager.DefaultConnectionLimit = 500; 
+0

不幸的是,这并没有帮助。也许我应该添加一些特定的设置到服务或IIS配置?这些服务是作为WCF服务实现的。 –

+0

@QuéPadre。尝试相反,设置DefaultConnectionLimit = 2。我的测试显示HttpClient忽略DefaultConnectionLimit,除非您明确地设置它。通过同时向服务器发送200个请求,您在完成任何实际工作之前需要花费大量时间设置200个连接。 –