当前位置: 代码迷 >> 综合 >> 线程和进程(3)——安全调用线程的步骤
  详细解决方案

线程和进程(3)——安全调用线程的步骤

热度:52   发布时间:2023-10-01 21:27:24.0

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;}

 

  相关解决方案