提问
为什么我用C#时间控件监听UDP数据时,界面是没有响应了呢?
我thread的线程就可以!
监听方法如下:
- 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控件并在里面加了上述方法,会出现这样的情况:
(假设你的TIMER的interval属性是1000,你的UDP的TIMEOUT是2000……)
TIMER被触发……
执行到了udp1.Receive(ref p));……
由于Receive是个同步等待的方法,程序会wait……
udp的超时是2000,但是到了1000ms后TIMER又一次被触发,结果就是udp1尚在等待Receive结束,你又调用了它一次= =
而正是因为Receive方法是同步等待的,所以你在Thread里运行时一次Receive没结束是一定不会跳回"while(true)"去再Recieve一次滴
C#时间控件监听超时的解决方法:
1.丢到你自己的线程里去,不要用timer;
2.把udp的超时属性改的比timer的interval短
【编辑推荐】