Несколько 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();
        }
    }
}

0 ответов

Другие вопросы по тегам