.net - 最大并发 Http Web 请求数

标签 .net httpwebrequest multithreading

我正在对一个网络应用程序进行压力测试,并设置了一个 Windows 测试程序,该程序启动多个线程并在每个线程上发送一个网络请求。

问题是我得到以下输出:

01/09/09 11:34:04 Starting new HTTP request on 10
01/09/09 11:34:04 Starting new HTTP request on 11
01/09/09 11:34:04 Starting new HTTP request on 13
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 15
01/09/09 11:34:06 Starting new HTTP request on 11
01/09/09 11:34:06 11 has finished!
01/09/09 11:34:06 Starting new HTTP request on 14
01/09/09 11:34:06 14 has finished!

看起来最多有 5 个线程,即使我这样创建 100 个:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text);

    List<BackgroundWorker> workers = new List<BackgroundWorker>();

    for (int N = 0; N < numberOfThreads; N++)
    {

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        workers.Add(worker);
    }


    foreach(BackgroundWorker worker in workers)
    {
        worker.RunWorkerAsync();
    }

谁能告诉我这是怎么回事?

谢谢

编辑:如果按照建议我休眠 5 秒钟,而不是 httpwebrequest,那么我确实会触发更多线程,但没有我预期的那么多:

01/09/09 11:56:14 Starting new HTTP request on 7
01/09/09 11:56:14 Starting new HTTP request on 11
01/09/09 11:56:15 Starting new HTTP request on 12
01/09/09 11:56:15 Starting new HTTP request on 13
01/09/09 11:56:16 Starting new HTTP request on 14
01/09/09 11:56:16 Starting new HTTP request on 15
01/09/09 11:56:17 Starting new HTTP request on 16
01/09/09 11:56:17 Starting new HTTP request on 17
01/09/09 11:56:18 Starting new HTTP request on 18
01/09/09 11:56:19 Starting new HTTP request on 7
01/09/09 11:56:19 7 has finished!
01/09/09 11:56:19 Starting new HTTP request on 11
01/09/09 11:56:19 11 has finished!
01/09/09 11:56:19 Starting new HTTP request on 19
01/09/09 11:56:20 Starting new HTTP request on 20
01/09/09 11:56:20 Starting new HTTP request on 12
01/09/09 11:56:20 12 has finished!

看起来我每秒只启动 2 个线程,这对我来说似乎很慢。我想 Console.WriteLine 可能是个问题?

编辑:我设置

ThreadPool.SetMinThreads(100, 4); 

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

得到如下结果:

01/09/09 14:00:07 Starting new HTTP request on 11
01/09/09 14:00:07 Starting new HTTP request on 81
01/09/09 14:00:07 Starting new HTTP request on 82
01/09/09 14:00:07 Starting new HTTP request on 79
01/09/09 14:00:07 Starting new HTTP request on 83
01/09/09 14:00:07 Starting new HTTP request on 84
01/09/09 14:00:07 Starting new HTTP request on 85
01/09/09 14:00:07 Starting new HTTP request on 87
01/09/09 14:00:07 Starting new HTTP request on 88
...
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds

因此能够同时发出大量网络请求。这似乎在排队(调用 STA COM+ 服务器),这正是我所期望的。

谢谢你的帮助

最佳答案

您的所有(或大部分)请求是否偶然发往同一主机?每个主机都有一个内置限制。您可以在 system.Net 的 app.config 中更改此设置 connectionManagement元素。

另一件事是线程池只会逐渐增加它的线程数量——它每半秒启动一个新线程,IIRC。这可能是你所看到的吗?尝试从等式中去掉 HttpWebRequest - 只需睡几秒钟...

我怀疑后一个问题是您最初遇到的问题,但第一个问题也会给您带来问题。

关于.net - 最大并发 Http Web 请求数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843369/

相关文章:

c# - 将字符串中的小时和分钟添加到日期时间

.net - 序列化/反序列化 GenericXmlSecurityToken 和安全性 - CRM Auth

ajax - Ajax 调用次数与数据大小

multithreading - 是否有必要在多线程代码中使用原子标志?

c++ - 什么时候使用互斥体?

.net - IIS Express applicationHost.config 文件包含无效条目,必须先更正才能打开项目

.net - 自定义 DependencyObject 继承树

c# - 取消异步httpwebrequest

使用 HttpWebRequest 时 Silverlight 5 插件崩溃或请求中止

java - java中的多个异步请求处理