多线程下 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)
{
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++;
}
}
[解决办法]
这个也不现实。有的通讯结束快、有的慢,不能搞平均主义。
实际上定死什么“10个线程、每个执行20次连接”这个也太死板了。不过我们可以先不纠结这个。
但是从这个简单的创意出发就可以推论出,你可以在200个连接达到时,就不再启动新的连结了!而每当一个连接,可以判断是否总共完成了200个。如果是,那么就重启路由器好了。
然后从头开始。
------解决方案--------------------
就不再启动新的连结了!而每当一个连接,可以判断 --> 就不再启动新的连结了!而每当一个连接处理完毕,可以判断
[解决办法]
最烂的代码就是那种写while循环、或者sleep之类的代码。
一个程序不需要再去获取新的连接任务的,它就正常结束了。
那么10个程序中,只有最后一个结束时,它回去重启路由器(其它就个线程早就结束了)。等路由器重启之后,这个程序再去创建9个线程就可以了。