C#安全调用线程的步骤
1.声明方法
2.声明委托类型
3.创建委托对象
4.启动线程
5.在线程调用的方法里通过Control的Invoke方法执行委托
public Form1() { InitializeComponent(); //TextBox.CheckForIllegalCrossThreadCalls = false;//线程访问控件(不安全的方式) dgShowMsgInTextBox = new DGShowMsgInTextBox(DoShowMsgInTextBox); } private void btnCount_Click(object sender, EventArgs e) { Count(); } private void Count()//用UI计数(不另外开启线程) { DateTime beginTime = DateTime.Now; for (int i = 0; i < 999999999; i++) { } System.Threading.Thread.Sleep(3000); DateTime endTime = DateTime.Now; TimeSpan ts = endTime.Subtract(beginTime); MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString()); } private void btnCountByThread_Click(object sender, EventArgs e)//用线程计数 { //创建线程对象(传入委托对象),也可以直接传方法 Thread thread = new Thread(Count); thread.Name = "t1"; //将线程标记为可以开始了 thread.Start(); } private void button1_Click(object sender, EventArgs e)//不安全的访问控件 { Thread threa = new Thread(CountAndShow); threa.Start(); } private void CountAndShow()//不安全的方式访问控件-需要设置TextBox.CheckForIllegalCrossThreadCalls = false { DateTime beginTime = DateTime.Now; for (int i = 0; i < 10000000; i++) { txtNum.Text = i.ToString(); } DateTime endTime = DateTime.Now; TimeSpan ts = endTime.Subtract(beginTime); MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString()); } private void CountAndShowSafety()//安全的访问UI线程上的控件 { DateTime beginTime = DateTime.Now;//记录开始时间 for (int i = 0; i < 10000000; i++) { //调用Control类的Invoke方法 执行委托里的 方法 this.Invoke(dgShowMsgInTextBox, i.ToString()); } DateTime endTime = DateTime.Now;//记录结束时间 TimeSpan ts = endTime.Subtract(beginTime);//计算时间差 MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString()); //Random r = new Random(); //r.Next(10) } private void button2_Click(object sender, EventArgs e)//安全的访问控件 需要使用委托,并最终通过Control的Invoke方法执行 { Thread tread = new Thread(CountAndShowSafety); tread.Start(); } delegate void DGShowMsgInTextBox(string msg);//安全访问控件的代码 声明一个委托类型 DGShowMsgInTextBox dgShowMsgInTextBox = null;//声明该委托的一个对象(在窗体的构造函数中实例化的),在线程执行代码中要访问控件时通过Invoke方法调用 void DoShowMsgInTextBox(string msg) { txtNum.Text = msg; }