UDP客户端只接收消息并冻结

本文关键字:消息 冻结 客户端 UDP | 更新日期: 2023-09-27 18:12:33

UDP客户端只接收消息并冻结

计时器只运行一次,不知道如何跟随他来筛选来自的UDP消息

namespace temp {
    public partial class Form1 : Form
    {  
    }
    public Form1()
    {
        InitializeComponent();    
    }
    private void Form1_Load(object sender, EventArgs e)
    { 
    }
    private void label1_Click(object sender, EventArgs e)
    {
    }
}

只运行一次

private void timer1_Tick(object sender, EventArgs e) {
    UdpClient client = new UdpClient();
    IPEndPoint localEp = new IPEndPoint(IPAddress.Any, 22);
    client.Client.SetSocketOption(SocketOptionLevel.Socket,           SocketOptionName.ReuseAddress, true);
    client.Client.Bind(localEp);
    IPAddress multicastaddress = IPAddress.Parse("127.0.0.1");
    Byte[] data = client.Receive(ref localEp);
    string mensaje = Encoding.UTF8.GetString(data);
    label1.Text += "" + mensaje.ToString() + "";
}

UDP客户端只接收消息并冻结

windows在UI线程上形成计时器"ticks"。这意味着,在timer_tick处理程序中花费的时间内,UI将不会刷新,并且应用程序将显示为冻结状态。

默认情况下,client.Receive()方法是一个阻塞操作,这意味着它将等待消息可用。

你可能想在这里改变一些事情:

  • UdpClient的创建移动到timer_tick功能之外;整个应用程序中只需要一个实例
  • 删除SocketOption.ReuseAddress,因为您将不再需要它
  • 使用异步方法而不是阻塞client.Receive(),因此您甚至不再需要计时器
  • 如果您觉得不能胜任异步编程的任务,可以设置client.Client.Blocking = false并捕获相应的SocketException。但是,对常规控制流使用异常是不好的