大家好,我在使用VS2005 C#编写udp通信程序时,有几个问题?1、 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    socket.sendto()这个方法是阻塞的吗?感觉它是非阻塞的。2、程序在执行Button1的点击事件时,点击Button2,其触发事件不会执行?还是延时执行?
   
3、我程序有个Timer1事件每500ms发送一条指令,Button1点击事件是发送另外一条指令,两者事件会互相打断吗?

解决方案 »

  1.   

    还补充一个问题
    4、如果我希望我的Button1点击事件总不会给打断或延时,是否应该建立一个独立的线程操作它?怎么操作?
      

  2.   

    大家好,我在使用VS2005 C#编写udp通信程序时,有几个问题?1、 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
      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,就没事!
      

  3.   

    看看这个例子吧!
    需要用email先注册用户,才能下载代码A Chat Application Using Asynchronous UDP sockets效果图:
      

  4.   

    谢谢,Anders!我还不清楚事件的触发机制,如果Button1的点击事件执行中(未有调用Button2点击事件),此时我点击Button2,那么这次Button2的事件是被抛弃?还是等待Button1完成后再执行?还是先执行Button2的再回去执行Button1的?同样情况,如果Timer1的触发事件在执行,点击Button2,或Button1事件执行中,Timer1触发了,他们的执行顺序或机制是怎么样的啊?
      

  5.   

    程序是并行处理的,你不要担心,button1点击后,button1的事件代码被执行,你去点击button2,button2的事件代码就会被窒息,只要他们之间没有冲突就好。
      

  6.   

    上面说的并行,是指的宏观上的并行,实际上代码在cpu都是串行处理,这个你知道的。
    还有如果button1执行的代码会导致界面没有响应,这个时候,你就无法点击button2了,这就需要button1的代码修改一下,改成后台线程独立执行,这样就不会影响主线程(处理界面等消息循环的)
      

  7.   


    也就是这次Button2的事件会被丢弃,不执行?
      

  8.   


    sendThread = new Thread(new ThreadStart(Button1_Click));
    sendThread.IsBackground = true;
    sendThread.Start();
    这样做是后台线程独立运行吗?我的Button1_Click里面有个无限等待Button2的点击事件赋值后退出的,但界面仍然卡死?