C#多线程的基础知识以及在Unity当中的应用

C#多线程的基础知识以及在Unity当中的应用


前言:多线程蕴含的知识是丰富的,作为前端开发,只阐述了一些基本的概念和使用方法

概念

什么是进程

概念:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

通俗易懂的讲:打开一个应用程序就是在操作系统上开启了一个进程,进程之间可以相互独立运行,互不干扰,进程之间也可以相互访问和操作(比如:我在电脑上打开了两个音乐播放软件,一个是网易云,一个是QQ音乐,我在本地已经下载好了一首歌,无论是使用网易云还是QQ音乐,我都可以打开这是歌进行播放,也可以同时播放,这相当于两个进程,同时访问了同一个文件)

什么是线程

概念:操作系统能够进行运算调度的最小单位。
它被包含在进程之中,是进程中的实际运作单位,一条线程指的是进程中一个单一顺序的控制流
一个进程中可以并发多个线程,我们目前写的程序,都在主线程中

简单理解线程:就是就是代码从上到下运行的一条“管道”

什么是多线程

通过代码,开启新的线程,可以同时运行代码的多条“管道”,就叫多线程

多线程的使用

C#中自带一个线程类:Thread
使用它之前,需要引用命名空间:

using System.Threading;
  1. 声明一个新的线程
    首先需要执行的多线程的代码,封装到一个自定义的函数中,先随便写一个新的线程的函数,取名为NewThread

    public void NewThread()
    {
          
          
         Console.WriteLine("新的线程逻辑");
    }
    

    声明一个新的线程,就是构造一个新的类对象,将线程函数放入该对象初始化

    Thread t = new Thread(NewThreadLogic);
    
  2. 启动线程

    t.Start();
    

    执行了NewThread函数语句块中的代码逻辑

  3. 设置为后台线程

    扫描二维码关注公众号,回复: 17189340 查看本文章
    t.IsBackground = true;
    

    新开的线程默认是作为前台线程来开启的;
    按照正常执行顺序来讲,主线程结束了,其他的所有线程都会随着主线程的结束而结束,
    假设其他的线程都是前台线程,且这些线程代码中包含了死循环,那么当主线程结束了,整个进程还是
    不会结束的,因为前台的线程卡住了进程的结束
    当设置为后台线程时,如果主线程结束了,后台线程也会被强制结束

  4. 关闭释放线程
    如果开启的线程中不是死循环 是能够结束的逻辑 那么不用刻意的去关闭它 代码逻辑执行完了自然就结束了,如果是死循环,想要中止这个线程有两种方式:

    • 如果是死循环的线程,改变Bool变量的值即可关闭线程,Bool条件不满足,线程就不运行了
    while(true) || while(false)
    
    • 语法关闭:(不适用于.Net Core,以及较低版本的.Net)
      通过提供的函数 停止当前对象里的线程
    t.Abort();
    

    或者直接滞空这个线程类对象

    t = null;
    
  5. 线程休眠
    Thread.Sleep(1000); 将这句代码写进线程函数里,写进那个函数就休眠那个线程
    以毫秒作为单位 1000ms = 1s

线程之间共享数据

  • 多个线程使用的内存是共享的,因为它们都同属一个一个进程下面,由于多线程是同时执行,访问同一个对象的时候,就会出现冲突
    当多线程 同时操作同一片内存区域时可能会出问题
    可以通过加锁的形式避免问题
//lock
//当我们在多个线程当中想要访问同样的东西 进行逻辑处理时
//为了避免不必要的逻辑顺序执行的差错
//lock(引用类型对象)

while (true)
{
    
    
 //当obj被锁住的时候 如果别的地方obj也被锁住的话 
 //就会先执行别的地方的代码逻辑 等锁住的地方的obj解锁了 也就是锁的地方代码执行完了
 //才会执行下一个锁
 lock (obj)
  {
    
    
   Console.SetCursorPosition(0, 0);
   Console.ForegroundColor = ConsoleColor.Red;
   Console.Write("●");
  }
}

C#多线程总结

  • 关键字 Thread
  • 多线程的意义
    可以用多线程专门处理一些复杂耗时的逻辑
    比如 寻路、网络通信等等
  • 比如有个复杂的计算逻辑,如果在主线程中执行(因为一个线程中,代码是由上到下执行的),会导致主线程卡顿,影响用户体验,使用多线程同时执行就会提高效率,可以理解为百度网盘的多任务下载,并行下载

#Unity中的多线程
Unity是支持多线程的,只是新开线程的无法访问Unity相关对象的内容(MonoBehaviour)
在自定义封装的多线程函数中不能访问任何Unity的组件相关对象,都会报错,那这样如何实现多线程呢?

>思路:我们可以通过创建一个容器(最好使用Queue 先进先出 符合需求),还是在多线程中进行计算,将多线程中计算好的结果,放入到Queue当中,然后再在主线程中取用计算好的结果即可,这样就间接的使用了多线程

注意:Unity中的多线程 要记住关闭
因为在Unity中写的多线程脚本挂载到场景中的游戏对象 游戏运行后结束运行 这个多线程还是在继续执行的,因为Unity本身是一个进程 相当于和Unity共生了

猜你喜欢

转载自blog.csdn.net/m0_69778537/article/details/134494670
今日推荐