首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

多线程上 HttpWebRequest 控制

2013-01-21 
多线程下 HttpWebRequest 控制有10个线程进行100个httpWebRequest任务还有一个ADSL重连计数变量httpWebReq

多线程下 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个线程就可以了。

热点排行