通过设置UI控件的Invoke和BeginInvoke方法实现更新,代码如下
1 public partial class fifth : Form 2 { 3 delegate void Change(string text); 4 public fifth() 5 { 6 InitializeComponent(); 7 } 8 private void Settext(string text) 9 { 10 textBox1.Text = text; 11 } 12 13 private void fifth_Load(object sender, EventArgs e) 14 { 15 Thread listen = new Thread(new ThreadStart(receive)); 16 listen.IsBackground = true; 17 listen.Start(); 18 } 19 private void receive() 20 { 21 UdpClient uc = new UdpClient(5839); 22 while (true) 23 { 24 IPEndPoint ip = null; 25 byte[] message = uc.Receive(ref ip); 26 string messagestring = Encoding.UTF8.GetString(message); 27 this.BeginInvoke(new Change(Settext),messagestring); 28 } 29 } 30 31 private void button1_Click(object sender, EventArgs e) 32 { 33 UdpClient uc = new UdpClient("127.0.0.1", 5839); 34 byte[] message = Encoding.UTF8.GetBytes("改变啦!"); 35 uc.Send(message,message.Length); 36 uc.Close(); 37 } 38 }
这个方法是目前跨线程更新UI使用的主流方法,使用控件的Invoke/BegainInvoke方法,将委托转到UI线程上调用,实现线程安全的更新。效果图如下
这种方法推荐使用,是当前的主流。