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() + "";
}
windows在UI线程上形成计时器"ticks"。这意味着,在timer_tick
处理程序中花费的时间内,UI将不会刷新,并且应用程序将显示为冻结状态。
默认情况下,client.Receive()
方法是一个阻塞操作,这意味着它将等待消息可用。
你可能想在这里改变一些事情:
- 将
UdpClient
的创建移动到timer_tick
功能之外;整个应用程序中只需要一个实例 - 删除
SocketOption.ReuseAddress
,因为您将不再需要它 - 使用异步方法而不是阻塞
client.Receive()
,因此您甚至不再需要计时器 - 如果您觉得不能胜任异步编程的任务,可以设置
client.Client.Blocking = false
并捕获相应的SocketException
。但是,对常规控制流使用异常是不好的