• 基本技能训练之线程


    这段时间看了金旭亮老师的软件开发三部曲的基本技能训练课程。现在总结一下关于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关键字,感觉不是最基础的多线程学习,所以一直迟迟没有学习,直到看到了金老师的课程。很开心,也很紧迫,因为很快就要面临实习和就业但是还是感觉自己的知识储备不够。要继续加油奋斗!!

  • 相关阅读:
    shell 函数
    使用Alpine镜像构建镜像
    macos修改vmware Fusion的NAT网络
    K8s Pod与宿主机时区不同步
    nginx热升级
    awk分析web日志
    k8s 新建用户远程连接集群和context切换
    查询出口公网ip
    微服务之服务网格 Istio
    Systemd 、systemctl进程管理工具
  • 原文地址:https://www.cnblogs.com/c-supreme/p/8580209.html
Copyright © 2020-2023  润新知