更新主窗口控件的内容1:子线程工作时同时更新主线程内的控件内容
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Threading; 10 11 namespace WindowsFormsApplication1 12 { 13 public partial class MainForm : Form 14 { 15 public MainForm() 16 { 17 InitializeComponent(); 18 } 19 20 delegate void SetMsg(string msg); 21 //private void SetMsgInfo(string msg) 22 //{ 23 // this.textBox1.Text = msg; 24 //} 25 26 private void button1_Click(object sender, EventArgs e) 27 { 28 Thread thread = new Thread(M1); 29 thread.Start(); 30 } 31 32 void M1() 33 { 34 for (int i = 0; i < 10; i++) 35 { 36 //this.Invoke(new SetMsg(SetMsgInfo), new object[] { i.ToString() }); 37 this.Invoke(new SetMsg((o) => { this.textBox1.Text = o; }), new object[] { i.ToString() });//匿名方法不懂的可以去查一下。 38 Thread.Sleep(500); 39 } 40 } 41 } 42 }
=================================================================================
这段代码如果使用以后的代码去替换,也可以达到每秒变换this.label1.Text的目的,但是这个用户体验却很差:在变化值时,窗体不能移动。用上面的方法可以避开这个问题。
private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { this.label1.Text = i.ToString(); this.Update(); Thread.Sleep(1000); } }