读书人

多线程上 HttpWebRequest 控制

发布时间: 2013-01-21 10:15:39 作者: rapoo

多线程下 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
[解决办法]

引用:
换个问法,如何等待httpwebrequest执行完毕线程5再重连ADSL 继续执行httpwebrequest

那你同步下就是了。设置一个event,每完成一个线程减去1,直到0再重新连接开新线程。
[解决办法]
引用:
引用:其实很容易,自己写HttpWebRequest就行了,无非就是socket write bytes
水平有限,还是用现成的吧。


学习一下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重连
[解决办法]
引用:
连接数不会到达上限, 我还有另外一个功能一直多线程递归 并发连接随便有好几百个。
问题主要出现在宽带断开的瞬间, 如何控制线程 等其他线程HttpWebRequest执行完毕在断开然后继续执行。

没有这么干的基础。

放弃当前的工作,从头开始。
[解决办法]
volatile int loginingThreadCount = 0;//正在登录线程数(登录任务数)

void test()
{

while(true)
{
loginingThreadCount++;
HttpWebRequest部分代码太长 省略。。。。。。
//宽带重拨后其他线程出错的地方
loginingThreadCount--;
//宽带重播部分
lock (Lock2)
{
if (replayNumber > 20)
{
while(loginingThreadCount!=0)


{
Thread.Sleep(1000);
}
try
{
Adsl.Disconnect();
Thread.Sleep(1000);
Adsl.Connection(configdic["tbx_AdslName"], configdic["tbx_AdslId"], configdic["tbx_AdslPassWord"]);
Thread.Sleep(1000);
}
catch (Exception ex)
{
MessageBox.Show("重拨出错:" + ex.ToString());
}
replayNumber = 1;
}
replayNumber++;
}
}
[解决办法]

引用:
换个问法,如何等待httpwebrequest执行完毕线程5再重连ADSL 继续执行httpwebrequest


这个也不现实。有的通讯结束快、有的慢,不能搞平均主义。

实际上定死什么“10个线程、每个执行20次连接”这个也太死板了。不过我们可以先不纠结这个。

但是从这个简单的创意出发就可以推论出,你可以在200个连接达到时,就不再启动新的连结了!而每当一个连接,可以判断是否总共完成了200个。如果是,那么就重启路由器好了。

然后从头开始。
------解决方案--------------------


就不再启动新的连结了!而每当一个连接,可以判断 --> 就不再启动新的连结了!而每当一个连接处理完毕,可以判断
[解决办法]

引用:
重连ADSL的时候其余9个线程暂停?还是什么方法?请指点一下。 本人自学C#概念和意识也不会很好。


最烂的代码就是那种写while循环、或者sleep之类的代码。

一个程序不需要再去获取新的连接任务的,它就正常结束了。

那么10个程序中,只有最后一个结束时,它回去重启路由器(其它就个线程早就结束了)。等路由器重启之后,这个程序再去创建9个线程就可以了。

读书人网 >C#

热点推荐