多线程下 HttpWebRequest 控制
有10个线程进行100个httpWebRequest任务
还有一个ADSL重连计数变量httpWebRequest任务完成一个计数变量+1
计数变量到20后重新连接ADSL然后归0.(这个搞不懂的不用管)
现在问题是10线程并发,如线程5执行的时候计数器到20了然后进行ADSL断开再连接同时其余9个线程大部分执行httpWebRequest的地方会出错。这个问题如何解决。
重连ADSL的时候其余9个线程暂停?还是什么方法?请指点一下。 本人自学C#概念和意识也不会很好。
------解决方案--------------------ADSL断开再连接,如果IP换了,那么导致“其余9个线程大部分执行httpWebRequest的地方会出错”是因为IP换了。暂停有什么用,只能让它们重新连接了。
------解决方案--------------------其实很容易,自己写HttpWebRequest就行了,无非就是socket write bytes
------解决方案--------------------
那你同步下就是了。设置一个event,每完成一个线程减去1,直到0再重新连接开新线程。
------解决方案--------------------
学习一下HTTP协议对你会很有帮助,花个3,5天就够了,如果你只是简单的请求其实是很容易的,我们不要被封装束缚,那只是简化我们一下工作而已,很多人会用httprequest但完全不能理解http协议也蛮可惜的,看看rfc2612
------解决方案--------------------他的问题不是webrequest的问题,,是线程控制的问题。。
补充7楼。。。
减1的时候,,因为是多线程,,加个锁。。。
c#下快速实现的是lock
------解决方案--------------------
System.Net.ServicePointManager.DefaultConnectionLimit加大。
比如:
System.Net.ServicePointManager.DefaultConnectionLimit = 65535;
之后要记得关闭连接,不然操作的不好的话, 你的内存就被吃满了。
------解决方案--------------------其实是你的Connection达到默认上限了…… HttpWebRequest有的时候会因为Connection: Keep-Alive 而造成GC不去回收它,即使不再用了也不会马上被关闭。
所以最好封装一下HttpWebRequest,什么时候Dispose自己说了算。
------解决方案--------------------当Adsl断网时,你用while等待其它9个线程都执行结束,结束后进行ADsl重连
------解决方案--------------------
没有这么干的基础。
放弃当前的工作,从头开始。
------解决方案--------------------volatile int loginingThreadCount = 0;//正在登录线程数(登录任务数)
void test()
{
while(true)
{
loginingThreadCount++;
HttpWebRequest部分代码太长 省略。。。。。。
//宽带重拨后其他线程出错的地方
loginingThreadCount--;
//宽带重播部分
lock (Lock2)
{
if (replayNumber > 20)
{
while(loginingThreadCount!=0)