zoukankan      html  css  js  c++  java
  • 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;
            } 
            
  • 相关阅读:
    并不对劲的loj3124:uoj477:p5405:[CTS2019]氪金手游
    并不对劲的loj6498. 「雅礼集训 2018 Day2」农民
    并不对劲的loj2251:p3688[ZJOI2017]树状数组
    并不对劲的loj2050:p3248:[HNOI2016]树
    并不对劲的BJOI2020
    并不对劲的loj3110:p5358:[SDOI2019]快速查询
    并不对劲的loj3111:p5359:[SDOI2019]染色
    (困难) CF 484E Sign on Fence,整体二分+线段树
    算法录 之 拓扑排序和欧拉路径。
    数据结构录 之 BST的高级应用。
  • 原文地址:https://www.cnblogs.com/xuhongfei/p/2815475.html
Copyright © 2011-2022 走看看