大家好,我在使用VS2005 C#编写udp通信程序时,有几个问题?1、 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.sendto()这个方法是阻塞的吗?感觉它是非阻塞的。2、程序在执行Button1的点击事件时,点击Button2,其触发事件不会执行?还是延时执行?
3、我程序有个Timer1事件每500ms发送一条指令,Button1点击事件是发送另外一条指令,两者事件会互相打断吗?
socket.sendto()这个方法是阻塞的吗?感觉它是非阻塞的。2、程序在执行Button1的点击事件时,点击Button2,其触发事件不会执行?还是延时执行?
3、我程序有个Timer1事件每500ms发送一条指令,Button1点击事件是发送另外一条指令,两者事件会互相打断吗?
4、如果我希望我的Button1点击事件总不会给打断或延时,是否应该建立一个独立的线程操作它?怎么操作?
socket.sendto()这个方法是阻塞的吗?感觉它是非阻塞的。
sentto是阻塞的,必须发送数据完成后,才会返回的!
这个才是非阻塞的!
clientSocket.BeginSendTo(byteData, 0, byteData.Length,
SocketFlags.None, epServer,
new AsyncCallback(OnSend), null);
2、程序在执行Button1的点击事件时,点击 Button2,其触发事件不会执行?还是延时执行?
如果你在button1中去调用button2的事件代码,例如
button2.PerformClick();
如果上面这句代码在SendTo后,则要等SendTo发送数据完成后,才会被执行,因为SendTo是阻塞的!
3、我程序有个Timer1事件每500ms发送一条指令,Button1点击事件是发送另外一条指令,两者事件会互相打断吗?
只好设计合理就没有问题。4、如果我希望我的Button1点击事件总不会给打断或延时,是否应该建立一个独立的线程操作它?怎么操作?
你可以用后台线程,但是只要你是使用了BeginSendTo,就没事!
需要用email先注册用户,才能下载代码A Chat Application Using Asynchronous UDP sockets效果图:
还有如果button1执行的代码会导致界面没有响应,这个时候,你就无法点击button2了,这就需要button1的代码修改一下,改成后台线程独立执行,这样就不会影响主线程(处理界面等消息循环的)
也就是这次Button2的事件会被丢弃,不执行?
sendThread = new Thread(new ThreadStart(Button1_Click));
sendThread.IsBackground = true;
sendThread.Start();
这样做是后台线程独立运行吗?我的Button1_Click里面有个无限等待Button2的点击事件赋值后退出的,但界面仍然卡死?