• C#进阶06——多线程,预处理器指令


    1.多线程

    1.了解线程前先了解进程

    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动

    是系统进行资源分配和调度的基本单位,是操作系统结构的基础

    说人话:打开一个应用程序就是在操作系统上开启了一个进程

    进程之间可以相互独立运行,互不干扰

    进程之间也可以相互访问、操作

    2.什么是线程

    操作系统能够进行运算调度的最小单位。

    它被包含在进程之中,是进程中的实际运作单位

    一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程

    我们目前写的程序 都在主线程中

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

    3.什么是多线程

    我们可以通过代码 开启新的线程

    可以同时运行代码的多条“管道” 就叫多线程

    4.语法相关

    线程类 Thread

    需要引用命名空间 using System.Threading;

    1.申明一个新的线程

    1. // 注意 线程执行的代码 需要封装到一个函数中
    2. // 新线程 将要执行的代码逻辑 被封装到了一个函数语句块中
    3. Thread t = new Thread(NewThreadLogic);

     2.启动线程

                t.Start();

    3.设置为后台线程

    1. //当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行
    2. //后台线程不会防止应用程序的进程被终止掉
    3. //如果不设置为后台线程 可能导致进程无法正常关闭
    4. t.IsBackground = true;

    4.关闭释放一个线程 

    如果开启的线程中不是死循环 是能够结束的逻辑 那么 不用刻意的去关闭它

    如果是死循环 想要终止这个线程 有两种方式

    1. 4.1-死循环中bool标识
    2. //Console.ReadKey();
    3. //isRuning = false;
    4. //Console.ReadKey();
    1. 4.2-通过线程提供的方法(注意在.Net core版本中无法终止 会报错)
    2. //try
    3. //{
    4. // t.Abort();
    5. // t = null;
    6. //}
    7. //catch
    8. //{
    9. //
    10. //}

    5.线程休眠

    1. //让线程休眠多少毫秒 1s=1000毫秒
    2. //在哪个线程里执行 就休眠哪个线程
    3. //Thread.Sleep(1000);

    5. 线程之间共享数据

    多个线程使用的内存是共享的,都属于该应用程序(进程)

    所以要注意 当多线程 同时操作同一片内存区域时可能会出问题

    可以通过加锁的形式避免问题

    lock

    当我们在多个线程当中想要访问同样的东西 进行逻辑处理时

    为了避免不必要的逻辑顺序执行的差错

    lock (引用类型对象)

    1. static void Main(string[] args)
    2. {
    3. while (true)
    4. {
    5. lock(obj)
    6. {
    7. Console.SetCursorPosition(0, 0);
    8. Console.ForegroundColor = ConsoleColor.Red;
    9. Console.Write("●");
    10. }
    11. }
    12. }
    13. static void NewThreadLogic()
    14. {
    15. //新开线程 执行的代码逻辑 在该函数语句块中
    16. while(isRuning)
    17. {
    18. //Thread.Sleep(1000);
    19. //Console.WriteLine("新开线程代码逻辑");
    20. lock(obj)
    21. {
    22. Console.SetCursorPosition(10, 5);
    23. Console.ForegroundColor = ConsoleColor.Yellow;
    24. Console.Write("■");
    25. }
    26. }
    27. }

     6.多线程对于我们的意义

    可以用多线程专门处理一些复杂耗时的逻辑    比如 寻路、网络通信等等

    7.总结

    多线程是多个可以同时执行代码逻辑的“管道”

    可以通过代码开启多线程,用多线程处理一些复杂的可能影响主线程流畅度的逻辑

    关键字 Thread

    2.预处理器指令

    1.什么是编译器

    编译器是一种翻译程序

    它用于将源语言程序翻译为目标语言程序

    源语言程序:某种程序设计语言写成的,比如C#、C、C++、Java等语言写的程序

    目标语言程序:二进制数表示的伪机器代码写的程序

    2.什么是预处理器指令

    预处理器指令 指导编译器 在实际编译开始之前对信息进行预处理

    预处理器指令 都是以#开始

    预处理器指令不是语句,所以它们不以分号;结束

    目前我们经常用到的 折叠代码块 就是预处理器指令 

    3.常见的预处理器指令 

    1.#define
       定义一个符号,类似一个没有值的变量
       #undef
       取消define定义的符号,让其失效
       两者都是写在脚本文件最前面
       一般配合 if指令使用 或配合特性

    2.#if
       #elif
       #else
       #endif
       和if语句规则一样,一般配合#define定义的符号使用
       用于告诉编译器进行编译代码的流程控制
                
       如果发现有Unity4这个符号 那么其中包含的代码 就会被编译器翻译
       可以通过 逻辑或 和 逻辑与 进行多种符号的组合判断

    1. #if Unity4
    2. Console.WriteLine("版本为Unity4");
    3. #elif Unity2021 && IOS
    4. Console.WriteLine("版本为Unity2021");
    5. //#warning 这个版本 不合法
    6. //#error 这个版本不准执行
    7. #else
    8. Console.WriteLine("其它版本");
    9. #endif

    3.#warning

       #error

       告诉编译器

       是报警告还是报错误

       一般还是配合if使用

    4.总结

    预处理器指令

    可以让代码还没有编译之前就可以进行一些预处理判断

    Unity中会用来进行一些平台或者版本的判断

    决定不同的版本或者不同的平台使用不同的代码逻辑

  • 相关阅读:
    日志框架学习
    input 表单元素
    【diffusion model】扩散模型入门
    代码随想录打卡第五十三天|309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费
    关于工信部发布的app备案以及小程序备案流程
    【Netty 介绍】
    Day12 尚硅谷JUC——集合的线程安全
    mysql死锁的排查和解决
    鸡尾酒学习——原谅(自制)
    Java 读写锁 ReadWriteLock 原理与应用场景详解
  • 原文地址:https://blog.csdn.net/weixin_45274937/article/details/126642857