여러 스레드에서 HttpClient를 사용하는 데 약간의 문제가 있습니다. 나는 하나 개의 스레드가있는 경우 내가 동시에 많은 다운로드를 시작하면.NET HttpClient multithreading
는 각 스레드의 첫 번째 다운로드가 매우 느립니다 (및 병렬 스레드 증가) 예를 들어
, 모든 것이 괜찮
First download Elapsed Time Download: 197 ms
Second download Elapsed Time Download: 171 ms
하지만 하나의 스레드와 다운로드 시간 증가
First download Elapsed Time Download: 3881 ms
...
Second download Elapsed Time Download: 96 ms
...
네트워크 대역폭은 문제가되지 않습니다, 나는 localhost와 동일한 문제가 있습니다.
static void Main(string[] args)
{
ServicePointManager.DefaultConnectionLimit = 200;
List<Task> tasks = new List<Task>();
for (var i = 0; i < 10; i++)
{
tasks.Add(
Task.Factory.StartNew(() =>
{
Stopwatch s = Stopwatch.StartNew();
HttpClient httpClient = new HttpClient();
HttpResponseMessage httpDownloadResponse = httpDownloadResponse = httpClient.GetAsync("http://www.google.fr/", HttpCompletionOption.ResponseHeadersRead).Result;
s.Stop();
Console.WriteLine("First download Elapsed Time Download: {0} ms", s.ElapsedMilliseconds);
s = Stopwatch.StartNew();
httpClient = new HttpClient();
httpDownloadResponse = httpClient.GetAsync("http://www.google.fr/", HttpCompletionOption.ResponseHeadersRead).Result;
s.Stop();
Console.WriteLine("Second download Elapsed Time Download: {0} ms", s.ElapsedMilliseconds);
})
);
}
Task.WaitAll(tasks.ToArray());
while (Console.ReadLine() != null) ;
}
@Adriano -'Console'은 threadsafe이고 타이밍에 포함되지 않습니다. –
@BrianReischl 내 잘못! –
관련이있을 수도 있지만 그렇지 않을 수도 있지만 .net에서 관찰되는 규칙은 특정 클라이언트 OS에서 동일한 URL에 대한 세 개의 HTTP 연결 만 허용된다는 것입니다. 이는 ServicePointManager.DefaultConnectionLimit에 정의되어 있습니다. 이것은 http://stackoverflow.com/questions/866350/how-can-i-programmatically-remove-the-2-connection-limit-in-webclient에서 다루어지며, 여러분은 병렬 http 활동에 대한 극적인 감속을 관찰하게 될 것입니다 같은 URL에 – PhillipH