news 2026/10/16 1:43:18

【Unity开发】C#线程Thread类详细解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Unity开发】C#线程Thread类详细解析


🐾 个人主页 🐾
阿松爱睡觉,横竖醒不来
🏅你可以不屠龙,但不能不磨剑🗡

文章目录

  • 一、Thread
  • 二、线程创建与启动
  • 三、线程生命周期控制
  • 四、线程锁🔒
    • (一)lock
    • (二)Monitor类
    • (三)其他
  • 五、线程池(ThreadPool)
    • (一)Thread vs ThreadPool
    • (二)使用示例
  • 六、Unity中的特殊考量
  • 七、高级用法
    • (一)线程本地存储
    • (二)异步委托
    • (三)取消模式
  • 八、最佳实践建议
  • 九、注意事项

一、Thread

Thread类是 .NET 框架中用于创建和管理线程的核心类,它让我们能够直接控制操作系统层面的线程。简单来说,线程就是程序里并行执行任务的“工人”,而 Thread 类就是管理这些工人的“调度员”。


线程

  • 操作系统调度的最小执行单元,可以理解为 CPU 分配时间的最小单位
  • 共享进程资源,但拥有独立的执行路径,就像多个工人共用一间办公室,但各干各的活
  • 每个线程维护自己的调用栈和寄存器状态,相当于每个工人都有自己的工具箱和记事本状态

Thread属性

属性类型说明
IsAlivebool线程是否正在运行
IsBackgroundbool是否为后台线程(后台线程不会阻止程序退出)
Namestring线程名称(调试时方便识别)
PriorityThreadPriority线程调度优先级(越高越优先执行)
ThreadStateThreadState当前线程状态(如运行中、已停止等)

二、线程创建与启动

创建

// 通过ThreadStart委托创建Threadthread1=newThread(newThreadStart(SimpleMethod));// 通过Lambda表达式创建(常用)Threadthread2=newThread(()=>{Debug.Log("线程执行中");});// 带参数的线程(使用ParameterizedThreadStart)Threadthread3=newThread(ParameterizedMethod);thread3.Start("参数数据");

启动

thread1.Start();// 无参数启动thread3.Start("参数");// 带参数启动

三、线程生命周期控制

线程状态管理

// 暂停当前线程(毫秒)Thread.Sleep(1000);// 等待线程结束thread1.Join();// 无限等待thread1.Join(500);// 最多等待500ms// 终止线程(不推荐)thread1.Abort();// 已过时方法,会引发ThreadAbortException

线程优先级设置

thread1.Priority=ThreadPriority.Highest;// 提高优先级

优先级等级:

  • Highest
  • AboveNormal
  • Normal (默认)
  • BelowNormal
  • Lowest

四、线程锁🔒

当多个线程同时访问同一个共享资源(比如一个全局变量、一个文件)时,就会像多人同时抢同一支笔写字一样,造成数据错乱。lock 和 Monitor 就是用来确保同一时刻只有一个线程能进入特定代码块的“门禁系统”,谁先进去,谁就先办事,办完出来下一个再进。

(一)lock

lock 是 C# 提供的一个语法糖,是使用 Monitor 类最简洁、最安全的方式。它简单、不易出错,编译器会自动帮你处理 Monitor.Enter 和 Monitor.Exit 的配对,即使代码抛异常,也能确保锁被释放,不会出现“锁死”的情况。释放。

privateobject_lockObj=newobject();voidThreadSafeMethod(){lock(_lockObj){// 临界区代码}}

(二)Monitor类

Monitor是lock 底层的、功能更丰富的工具。提供了 lock 所不具备的高级功能,比如尝试进入锁(TryEnter),以及实现线程间的等待/脉冲(Wait/Pulse)机制。当你需要更精细的控制,而不是简单的互斥时使用。

Monitor.Enter(_lockObj);try{// 临界区代码}finally{Monitor.Exit(_lockObj);}

(三)其他

// 信号量Semaphoresemaphore=newSemaphore(3,3);// 允许3个并发// 互斥体Mutexmutex=newMutex();// 读写锁ReaderWriterLockSlimrwLock=newReaderWriterLockSlim();

五、线程池(ThreadPool)

跟对象池相似的还有线程池ThreadPool,都是为了减少频繁创建时减少的性能开销。

(一)Thread vs ThreadPool

特性ThreadThreadPool
创建开销大小
数量控制手动自动管理
生命周期手动管理自动回收
适用场景长时间任务短时间任务
优先级设置支持不支持

(二)使用示例

ThreadPool.QueueUserWorkItem(state=>{// 后台执行的任务Debug.Log($"线程池线程ID:{Thread.CurrentThread.ManagedThreadId}");});

六、Unity中的特殊考量

Unity API线程限制

// 错误示例:Threadthread=newThread(()=>{GameObject.CreatePrimitive(PrimitiveType.Cube);// 会报错});// 正确做法:通过主线程调度器UnityMainThreadDispatcher.Instance.Enqueue(()=>{GameObject.CreatePrimitive(PrimitiveType.Cube);});

线程安全日志

voidThreadLog(stringmessage){lock(consoleLock){Debug.Log($"[Thread{Thread.CurrentThread.ManagedThreadId}]{message}");}}

协程与线程结合

IEnumeratorThreadCoroutine(){booldone=false;stringresult=null;Threadthread=newThread(()=>{result=HeavyCalculation();done=true;});thread.Start();while(!done){yieldreturnnull;}Debug.Log($"计算结果:{result}");}

七、高级用法

(一)线程本地存储

ThreadLocal<int>threadLocalValue=newThreadLocal<int>(()=>42);voidThreadMethod(){Debug.Log(threadLocalValue.Value);// 每个线程独立的值}

(二)异步委托

Func<int,int,int>add=(a,b)=>a+b;IAsyncResultresult=add.BeginInvoke(2,3,null,null);intsum=add.EndInvoke(result);// 获取结果

(三)取消模式

CancellationTokenSourcects=newCancellationTokenSource();Threadthread=newThread(()=>{while(!cts.IsCancellationRequested){// 可取消的任务}});thread.Start();// 需要取消时cts.Cancel();

八、最佳实践建议

  1. 命名线程:调试时便于识别

    thread.Name="NetworkThread";
  2. 异常处理:线程内必须捕获异常

    newThread(()=>{try{/* 代码 */}catch(Exceptionex){/* 处理 */}}).Start();
  3. 资源清理:确保释放线程持有的资源

    using(varresource=newDisposableResource()){newThread(()=>{resource.DoWork();}).Start();}
  4. 避免Abort:使用协作式取消替代强制终止

  5. 性能考量:

    • 线程创建开销大约在1-10毫秒
    • 每个线程默认占用1MB栈空间
    • 推荐使用ThreadPool处理短任务

九、注意事项

Thread类提供了底层的线程控制能力,但在现在的C#日常开发中,多数场景推荐使用更高级的Task和async/await模式。只有在需要精细控制线程特性(如优先级、命名等)时,才应该直接使用Thread类。

在Unity中尤其需要注意:

  • 主线程才能调用Unity API
  • 使用lock时要避免死锁
  • 长时间运行的线程应该设置为后台线程
  • 多线程访问Unity对象需格外小心

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 1:42:20

OpenStack多区域部署实战:基于kolla-ansible的架构设计与避坑指南

1. 多区域部署到底在解决什么问题第一次接触多区域这个概念&#xff0c;是在一个跨机房容灾的项目里。当时业务侧提的需求很直接&#xff1a;单机房挂掉之后&#xff0c;核心业务要在可接受的时间内恢复&#xff0c;而且日常状态下两个机房的资源都要能用起来&#xff0c;不能白…

作者头像 李华
网站建设 2026/10/16 1:39:19

MXSPyCOM源码解析:MaxScript与Python进程间通信实战

简介&#xff1a;MXSPyCOM是一套面向3ds Max脚本开发者的开源工具源码包&#xff0c;重点解决内置编辑器功能有限、编写MaxScript与Python脚本效率低的问题。它通过COM通信机制打通3ds Max与外部编辑器&#xff0c;让用户可在VS Code、Sublime Text、PyCharm等工具中编写并实时…

作者头像 李华
网站建设 2026/10/16 1:38:26

lolPing 桌面应用怎么测:测试与 CI 实践完整清单

【免费下载链接】lolPing League of Legends ping wheel for your Windows desktop. Hold Alt, drag, and ping anywhere, with the original animations and sounds. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/lo/lolPing 点击查看 免费下载 lolPing 是一个给 Wi…

作者头像 李华
网站建设 2026/10/16 1:38:21

如何下载安装 Chatlog Alpha:macOS 与 Windows 全平台部署清单

后端CLIMCP 服务即时通讯RAG人工智能AI 技能 【免费下载链接】chatlog_alpha 原 [chatlog]项目&#xff08;一个微信数据库解密读取及提供mcp服务、http服务的开源软件&#xff09;&#xff0c;现已支持通过微信clawbot接口推送消息&#xff0c;可以实时转发全部或指定消息到cl…

作者头像 李华