C# 限制并发未完成请求的因素

C# 限制并发未完成请求的因素,c#,networking,concurrency,fiddler,webrequest,C#,Networking,Concurrency,Fiddler,Webrequest,我正在努力实现每秒大量的webrequests 使用C#,我使用多个线程发送webrequest,发现无论我创建了多少线程, 在服务器快速响应的情况下,webrequest的最大数量约为每秒70个 我尝试使用fiddler模拟超时响应,以便更好地理解并发的未完成web请求 无论线程数量多少,都会立即触发2x个请求,之后,排队的请求一个接一个地缓慢触发,尽管之前的请求仍然得到响应。一旦有完成的请求,排队的请求会更快地激发以补充数量。一旦达到预初始化量,初始化就需要时间。此外,响应小到可以忽略带宽问

我正在努力实现每秒大量的webrequests

使用C#,我使用多个线程发送webrequest,发现无论我创建了多少线程, 在服务器快速响应的情况下,webrequest的最大数量约为每秒70个

我尝试使用fiddler模拟超时响应,以便更好地理解并发的未完成web请求

无论线程数量多少,都会立即触发2x个请求,之后,排队的请求一个接一个地缓慢触发,尽管之前的请求仍然得到响应。一旦有完成的请求,排队的请求会更快地激发以补充数量。一旦达到预初始化量,初始化就需要时间。此外,响应小到可以忽略带宽问题

下面是代码

我在不同的网络中尝试了WindowsXP和Windows7。同样的事情也会发生

public Form1()
{
System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
for (int i = 0; i < 80; i++)
{
    int copy = i;
    new Thread(() =>
    {
        submit_test(copy);
    }) { IsBackground = true }.Start();
}
}
public void submit_test(int pos)
{
    webRequest = (HttpWebRequest)WebRequest.Create("http://www.test.com/");
    webRequest.Method = "GET";
    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
    {
    }
}
public Form1()
{
System.Net.ServicePointManager.DefaultConnectionLimit=1000;
对于(int i=0;i<80;i++)
{
int copy=i;
新线程(()=>
{
提交测试(复印件);
}){IsBackground=true}.Start();
}
}
公共无效提交测试(int pos)
{
webRequest=(HttpWebRequest)webRequest.Create(“http://www.test.com/");
webRequest.Method=“GET”;
使用(HttpWebResponse webResponse=(HttpWebResponse)webRequest.GetResponse())
{
}
}
是网卡限制了即时发射量吗

我知道大型服务器可以同时处理数千个传入请求。这和发送请求(建立连接)不一样吗

请告诉我使用服务器是否有助于解决问题

更新线索:

1) 我怀疑路由器是否限制并拔下了它。没有区别

2) Fiddler显示一个排队的请求恰好每秒触发一次

3) 我使用apache基准测试工具尝试发送并发超时请求,同样的情况也发生了。这不太可能是.Net问题

4) 我尝试连接到本地主机。没有区别

5) 我用begingetresponse代替,没有区别

6)我怀疑这是否是小提琴手的问题。我也使用wireshark来捕获流量。明智地说,fiddler模拟了保留的传出请求,并且实际上收到了响应。 实际上没有未完成的请求。似乎是提琴手在排队等待请求。找到更好的测试方法后,我将编辑/关闭问题


我已经陷入这个问题好几天了。如果你能想到的话,请告诉我任何一种可能性。

直接创建线程会带来很多开销。尝试使用任务工厂而不是线程。任务在幕后使用线程池,它重用线程,而不是持续创建线程

        for (int i = 0; i < 80; i++)
        {
            int copy = i;
            Task.Factory.StartNew(() =>
            {
                submit_test(copy);
            });
        }
for(int i=0;i<80;i++)
{
int copy=i;
Task.Factory.StartNew(()=>
{
提交测试(复印件);
});
}
查看关于该主题的其他帖子:


直接创建线程会带来大量开销。尝试使用任务工厂而不是线程。任务在幕后使用线程池,它重用线程,而不是持续创建线程

        for (int i = 0; i < 80; i++)
        {
            int copy = i;
            Task.Factory.StartNew(() =>
            {
                submit_test(copy);
            });
        }
for(int i=0;i<80;i++)
{
int copy=i;
Task.Factory.StartNew(()=>
{
提交测试(复印件);
});
}
查看关于该主题的其他帖子:


最后,我发现由于fiddler的实现,我的测试不准确。由于未知原因,请求在2个未完成的请求之后排队

我设置了一个服务器并限制其带宽以模拟超时响应


使用wireshark,我可以看到,只要线程准备好,150 SYN就可以在1.4s左右发送。

最后,我发现由于使用了fiddler,我的测试不准确。由于未知原因,请求在2个未完成的请求之后排队

我设置了一个服务器并限制其带宽以模拟超时响应


使用wireshark,我可以看到,只要线程准备好,150 SYN就可以在1.4s左右发送。

我记得没错,因为Windows XP限制了10个半开放连接。我不知道它是否还在。我正在使用WindowsXP,我记得我已经打了256补丁。我会检查这个因素是否限制了我,谢谢!我把它设为500,但还是一样。这不是原因。我记得没错,因为Windows XP限制了10个半开放连接。我不知道它是否还在。我正在使用WindowsXP,我记得我已经打了256补丁。我会检查这个因素是否限制了我,谢谢!我把它设为500,但还是一样。这不是原因。我确信每个线程在启动后都会初始化。在我的情况下,限制不应该是线程。使用task将使webrequests不能同时启动。我确信每个线程在启动后都会初始化。在我的情况下,限制不应该是线程。使用task也会使webrequests无法同时启动。