zoukankan      html  css  js  c++  java
  • 基本技能训练之线程

    这段时间看了金旭亮老师的软件开发三部曲的基本技能训练课程。现在总结一下关于C#线程方面的知识,加深一下印象,再梳理一下知识。

    现在主流的操作系统都支持多任务并行执行,而线程就是操作系统分配CPU的基本单元

    可以把分割出来的工作任务封装成线程函数,由线程负责执行。线程的运行过程就体现为线程函数的执行过程。

    1.线程的构造函数

    public Thread(ThreadStart start);
    public Thread(ParameterizedThreadStart start);

     线程的构造函数由两种,一种是ThreadStart 是一个不带参数,没有返回类型的委托

    另一种就是ParameterizedThreadStart,是一个带一个Object的参数,同样没有返回类型的委托。这两个委托都是用来挂接外部的方法,当线程运行是就会执行该函数

    public delegate void ThreadStart();
    public delegate void ParameterizedThreadStart(object obj);

    2.线程对象的创建的三种方法与执行

    C#线程类 Thread--不带参数的方法

         public void ThreadMethod()//用来被线程调用的方法
            {
                //方法内部代码
            }
            static void Main()
            {
                //ThreadStart 是一个没有参数,没有返回值的委托,用来挂接被线程调用的方法
                Thread th = new Thread(new ThreadStart(ThreadMethod));//创建一个线程对象
                th.Start();//调用Start方法运行线程
            }

     C#线程类 Thread--带object参数的方法

    public void RefreshLable(object infoValue)
            {
                Action<string> del = (string info) =>
                {
                    //方法内部代码
                };
            }
    
    static void Main()
            {
                Thread th = new Thread(RefreshLable);
                th.Start(obj);//在调用Start方法时传入一个Object类型的参数 这个参数会传入执行方法中
               
            }

    3.线程的终止

    在线程函数中可以使用Thread.CurrentThread可获取负责执行此函数的线程对象的引用

    使用Abort方法提前终止线程 但是要注意 在线程方法里要try catch一下,然后调用ReSetAbort方法 否则CLR会抛出异常

    class Program
        {
            static void Main(string[] args)
            {
                System.Console.WriteLine("主线程开始");
                //创建线程对象
                MyThread obj = new MyThread();
                Thread th = new Thread(obj.SomeLongTask);
                th.IsBackground = true;
                th.Start();//启动线程
                Thread.Sleep(300);  //主线程休眠0.3秒
                System.Console.WriteLine("主线程调用Abort方法提前中止辅助线程……");
                th.Abort();  //提前中止线程
                System.Console.WriteLine("主线程结束");
                Console.ReadKey();
    
            }
        }
    
        class MyThread
        {
            public void SomeLongTask()
            {
                try
                {
                    System.Console.WriteLine("辅助线程开始...");
                    for (int i = 0; i < 10; i++)
                    {
                        System.Console.WriteLine(i);
                        Thread.Sleep(200);
                    }
                }
                catch (ThreadAbortException e)
                {
                    System.Console.WriteLine("辅助线程被提前中断:{0}", e.Message);
                    Thread.ResetAbort();  //不加此句,CLR会再次抛出ThreadAbortException,从而导致函数最后一句代码不会执行。
                }
                finally
                {
                    System.Console.WriteLine("完成清理辅助线程占用的资源工作");
                }
                //如果前面没有Thread.ResetAbort(),则程序流程不会执行到此句。
                System.Console.WriteLine("辅助线程结束");
            }
        }

    4.背景线程

    IsBackgruoud属性设置为true表示线程为背景线程,当一个线程被设置为背景线程之后,当主线程一结束,背景线程也会自动中断

    默认情况下IsBackgruoud属性为false,成为前台线程,CLR会等待所有的前台线程结束后才会结束整个进程

    5.Join方法

     th调用Join方法后,主线程会在此处等待,直到th线程执行完毕,主线程才会继续执行

    static void Main(string[] args)
            {
                Console.WriteLine("主线程开始运行");
                Thread th = new Thread(new ThreadStart(ThreadAMethod));
                th.Start();
                th.Join();
                Console.WriteLine("主线程退出");
                Console.ReadKey();
            }

    6.线程状态

    线程属于进阶部分,也是非常重要的一部分,我学起来感觉有些地方还是有些难度,但是很有意思。多线程的程序很难调试,下断点之后会因为启动其他的线程而很难追踪。这是我刚刚接触多线程开发之后的初步感觉。

    此前一直想学习多线程,但是C#图解教程上直接就讲async 和await关键字,感觉不是最基础的多线程学习,所以一直迟迟没有学习,直到看到了金老师的课程。很开心,也很紧迫,因为很快就要面临实习和就业但是还是感觉自己的知识储备不够。要继续加油奋斗!!

  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/c-supreme/p/8580209.html
Copyright © 2011-2022 走看看