• Thread


    一、启动线程调用无参数无返回值方法

             Thread t1 = new Thread(new ThreadStart(M1));//参数ThreadStart是无参无返回值的委托;这个线程并没有启动
                t1.Start();//向操作系统请求启动线程。什么时候执行由cpu决定
                Console.WriteLine("ok");
                Console.ReadKey();
    
         static void M1()
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(i);
                }
            }
    

    二、启动一个线程执行带参数的方法

                Thread t1 = new Thread(new ParameterizedThreadStart(M2));
                t1.Start(100);
                Console.WriteLine("主线程继续。。。。ok");
                Console.ReadKey();
    
    
    //上面的参数ParameterizedThreadStart是一个object类型的委托
       static void M2(object n)
            {
                int max = (int)n;
                int sum = 0;
                for (int i = 1; i < max; i++)
                {
                    sum += i;
                }
                Console.WriteLine(sum);
            }
    

    三、通过另一种方式启动一个线程执行带参数的方法(把方法封装一下)

             //思路:把要执行的方法封装成一个类
                //把原本方法的参数,变成类的属性
                //在方法中把使用参数的地方都用属性来替换
                //在调用该方法的时候,为属性赋值,即为参数赋值。
                MyClass mc = new MyClass();
                mc.Number = 101;
                Thread t1 = new Thread(new ThreadStart(mc.M3));
                t1.Start();
                Console.WriteLine("ok");
                Console.ReadKey();
    
      public class MyClass
        {
            public int Number
            {
                get;
                set;
            }
            public void M3()
            {
                int sum = 0;
                for (int i = 1; i < this.Number; i++)
                {
                    sum += i;
                }
                Console.WriteLine(sum);
            }
        }
    

    四、线程的其他常用成员

                //Thread.CurrentThread.Priority = ThreadPriority.Lowest;//线程优先级
                Thread t = new Thread(new ThreadStart(() =>
                {
                    for (int i = 0; i < 5; i++)
                    {
                        Console.WriteLine(".");
                        Thread.Sleep(1000);
                    }
                }));
               t.IsBackground = true;//设置为后台线程,默认是前台线程!后台线程设置的意义就是进程结束(所有前台线程退出了),后台线程也会退出,否则主程序退出后线程没执行完还在继续跑
                t.Name = "我的线程";//只能赋值一次,多次赋值出错
                //t.Priority = ThreadPriority.Highest;
                t.Start();
                Console.WriteLine("主线程继续执行......");
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("=");
                    Thread.Sleep(1000);
                }
                Console.WriteLine("主线程该做的已经做完了,开始等待t线程结束");
                //这句话(t.Join();)在哪个线程中执行,那么就阻塞了那个线程,那个线程要等待t线程执行完毕后,然后才会继续。
                t.Join();//阻塞当前"主线程",等待t线程执行完毕后,继续主线程的执行。
                t.Join(1000); //1000表示超时时间,这里“主线程”会等待t线程执行完毕,只等待1000毫秒,超过1000毫秒后,“主线程”继续执行。
                //t.ThreadState=ThreadState
              t.Abort();//终止这个线程的执行
                Console.WriteLine("主线程执行完毕!");
                Console.ReadKey();
    

    五、winform跨线程访问的问题

    1、 告诉控件不检查跨线程访问,最后不这样做!看第二条
    Control.CheckForIllegalCrossThreadCalls = false;
    2、比如textBox1.Text = "你好!";
      Thread t1 = new Thread(new ThreadStart(() =>
                {
                    //如果在这里直接使用这个控件,则是在t1线程中来访问textbox1控件,这样是不允许的。
                    //this.textBox1.Text = "你好!";
                    //解决思路:将操作控件的代码,不要在t1线程中执行,把操作控件的代码放到主线程中执行UI线程。
                    //任何控件的Invoke()方法表示将指定的代码在创建该控件的线程中执行
                    //该方法有两个意思:1.找到创建textbox1控件的线程2.把Invoke()的参数(就是一个委托),设置在创建该控件的线程上执行。
                    //Invoke(参数1,参数2)参数1:表示要在创建该控件的线程上执行的方法。参数2是一个可变参数,表示要执行的方法的参数列表。要执行的方法有几个参数则传递几个值。
                    this.textBox1.Invoke(new Action<string>((msg) => { textBox1.Text = msg; }), "你好!");
                }));
                t1.IsBackground = true;
                t1.Start();
    

      

  • 相关阅读:
    POJ 1611 : The Suspects (普通并查集)
    深入解析 Dubbo 3.0 服务端暴露全流程
    智能搜索推荐一体化营收增长解决方案
    云上应用系统数据存储架构演进
    EMR on ACK 全新发布,助力企业高效构建大数据平台
    介绍一下闭包和闭包常用场景?
    BFC
    高斯消元学习笔记
    云虚拟主机如何设置域名解析
    Centos7.3安装openJDK
  • 原文地址:https://www.cnblogs.com/entclark/p/8025374.html
Copyright © 2020-2023  润新知