Несколько HttpWebRequests задерживается
Я хочу протестировать веб-сервис с несколькими одновременными вызовами, поэтому я написал тестовую программу, которая запускает 100 потоков, каждый из которых вызывает один и тот же метод в веб-сервисе. Все потоки запускаются одновременно, но веб-служба получает каждый из запросов с задержкой на полсекунды. Я могу увидеть это путем отладки веб-службы, а также, если я запускаю Fiddler, я вижу эту задержку в вызовах HTTP.
Я установил достаточно высокий уровень DefaultConnectionLimit в ServicePointManager и попытался изменить его параметры UseNagleAlgorithm и Expect100Continue, но это не помогло. Может кто-нибудь сказать мне, почему HTTP-вызовы, кажется, задерживаются, когда я запрашиваю их одновременно?
Вот мой код:
using System;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading;
namespace ConsoleApplication1
{
class Data
{
public Data(CountdownEvent cde, int number)
{
Cde = cde;
Number = number;
}
public CountdownEvent Cde { get; private set; }
public int Number { get; private set; }
}
class Program
{
static void Main(string[] args)
{
int numThreads = 100;
var cde = new CountdownEvent(numThreads);
// controls number of concurrent http connections
ServicePointManager.DefaultConnectionLimit = numThreads;
var sw = new Stopwatch();
sw.Start();
// start the threads
for (int i = 0; i < numThreads; i++)
{
var t = new Thread(CallWebService);
t.Start(new Data(cde, i + 1));
}
// wait for all the threads to finish
cde.Wait();
sw.Stop();
Console.WriteLine(string.Format("Finished in {0} milliseconds", sw.ElapsedMilliseconds));
}
private static void CallWebService(object state)
{
var data = (Data)state;
Console.WriteLine(string.Format("Thread {0} starting at {1}", data.Number, DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond));
var sw = new Stopwatch();
sw.Start();
var request = (HttpWebRequest)WebRequest.Create("http://mywebservice/test");
request.Method = "GET";
string result;
using (var response = (HttpWebResponse)request.GetResponse())
{
var reader = new StreamReader(response.GetResponseStream());
result = reader.ReadToEnd();
}
sw.Stop();
Console.WriteLine(string.Format("Thread {0} finishing at {1}, took {2} milliseconds", data.Number, DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond, sw.ElapsedMilliseconds));
data.Cde.Signal();
}
}
}