全速加载中

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

 

posted @ 2012-12-12 22:30  许鸿飞  阅读(315)  评论(0编辑  收藏  举报