【问题标题】:WebRequest Threads Blocking at Two RequestsWebRequest 线程在两个请求时阻塞
【发布时间】:2011-08-19 14:21:10
【问题描述】:

我需要测试数据上下文并查看它在多个同时请求下的行为,为此我制作了一个简单的控制台应用程序,[理论上] 将发送这些请求:

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();
        }
    }
}

我得到的输出是:

谁能解释一下这种行为?为什么在两次请求后停止?

谢谢

【问题讨论】:

    标签: multithreading post console webrequest


    【解决方案1】:

    是的,这是因为默认情况下每个 URL 的连接数限制为 2 - 连接是池化的。

    您通过将数据写入请求流来占用连接,但是却永远得不到响应。一个简单的:

    using (webRequest.GetResponse()) {}
    

    在方法的最后很可能把它整理出来。这将完成请求并释放连接以供另一个请求使用。

    另请注意,用于输出流的using 语句也会使您的代码更简单。

    【讨论】:

    • 谢谢,它有效,我会尽快标记为已回答
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多