關(guān)于C#時(shí)間控件的提問(wèn)與解答
提問(wèn)
為什么我用C#時(shí)間控件監(jiān)聽(tīng)UDP數(shù)據(jù)時(shí),界面是沒(méi)有響應(yīng)了呢?
我thread的線程就可以!
監(jiān)聽(tīng)方法如下:
- IPEndPoint pp=new IPEndPoint(IPAddress.Parse("127.0.0.1"),12345);
- UdpClient udp1=new UdpClient(pp);
- while(true)
- {
- IPEndPoint p=null;
- this.textBox2.Text=new UTF8Encoding().GetString(udp1.Receive(ref p));
- }
解答
如果你用了TIMER控件并在里面加了上述方法,會(huì)出現(xiàn)這樣的情況:
(假設(shè)你的TIMER的interval屬性是1000,你的UDP的TIMEOUT是2000……)
TIMER被觸發(fā)……
執(zhí)行到了udp1.Receive(ref p));……
由于Receive是個(gè)同步等待的方法,程序會(huì)wait……
udp的超時(shí)是2000,但是到了1000ms后TIMER又一次被觸發(fā),結(jié)果就是udp1尚在等待Receive結(jié)束,你又調(diào)用了它一次= =
而正是因?yàn)镽eceive方法是同步等待的,所以你在Thread里運(yùn)行時(shí)一次Receive沒(méi)結(jié)束是一定不會(huì)跳回"while(true)"去再Recieve一次滴
C#時(shí)間控件監(jiān)聽(tīng)超時(shí)的解決方法:
1.丟到你自己的線程里去,不要用timer;
2.把udp的超時(shí)屬性改的比timer的interval短
【編輯推薦】