Блокировка потоков WebRequest при двух запросах - PullRequest
0 голосов
/ 19 августа 2011

Мне нужно протестировать контекст данных и посмотреть, как он работает при нескольких одновременных запросах, для этого я сделал простое консольное приложение, которое [в теории] будет отправлять эти запросы:

private static DateTime startTime = DateTime.Now.AddSeconds(5);
public static Random rand = new Random();

static void Main(string[] args)
{
    const byte testThreads = 10;

    ThreadStart[] threadStarts = new ThreadStart[testThreads];
    Thread[] threads = new Thread[testThreads];

    for (byte i = 0; i < testThreads; i++)
    {
        threadStarts[i] = new ThreadStart(ExecutePOST);
        threads[i] = new Thread(threadStarts[i]);
    }

    for (byte i = 0; i < testThreads; i++){ threads[i].Start(); }

    for (byte i = 0; i < testThreads; i++){ threads[i].Join(); }
}

вызываемыйфункция

private static void ExecutePOST()
{
    while (DateTime.Now < startTime) { }

    Console.WriteLine("{0} STARTING TEST", DateTime.Now.Millisecond);
    WebRequest webRequest = WebRequest.Create(/*URL*/);
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.Method = "POST";

    string name = string.Format("Test {0}", Program.rand.Next(1000));

    byte[] bytes = Encoding.ASCII.GetBytes(/*PARAMETERS*/);
    Stream output = null;
    try
    {
        webRequest.ContentLength = bytes.Length;
        output = webRequest.GetRequestStream();
        output.Write(bytes, 0, bytes.Length);

        Console.WriteLine("{0}:{1}", DateTime.Now.Millisecond, name);
    }
    catch (WebException ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        if (output != null)
        {
            output.Close();
        }
    }
}

Вывод, который я получаю: Output

Может кто-нибудь объяснить, пожалуйста, это поведение?Почему он останавливается после двух запросов?

Спасибо

1 Ответ

3 голосов
/ 19 августа 2011

Да, это потому, что количество соединений на URL-адрес по умолчанию ограничено 2 - соединения объединяются в пул.

Вы подключаете соединение, записывая данные в поток запросов, но потом не получаетеответ.Простое:

using (webRequest.GetResponse()) {}

в конце метода, скорее всего, с этим разберутся.Это завершит запрос и освободит соединение, которое будет использоваться другим запросом.

Также обратите внимание, что оператор using для выходного потока также упростит ваш код.

...