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