多线程1:线程基础
线程是一个虚拟进程,用于独立运行一个特定的程序(代码)。
线程会消耗大量的操作系统资源,运行在多核CPU上才有意义。
1、终止线程
使用Thread.Abort方法可以终止线程(仅.NetFramework有效,.Net5不支持该方法)。
Thread.Abort方法不一定总能终止线程,因为目标线程可以使用Thread.ResetAbort方法来拒绝被终止。
可以通过提供CancellationToken方法来取消线程的执行。
2、运行核心
可以通过设置Process.ProcessorAffinity来让(当前进程的)所有线程运行在单个CPU核心上。
3、后台线程
显式创建的线程是前台线程。
通过设置Thread.IsBackground为true来创建后台线程。
进程会等待所有的前台线程完成后再结束工作,但是如果只剩下后台线程,则会直接结束工作。
如果程序定义了一个不会完成的前台线程,主程序不会正常结束。
4、lambda表达式中的闭包
使用lambda表达式引用另一个C#对象的方式被称为闭包。
当在lambda表达式中使用任何局部变量时,C#会生成一个类,并将该变量作为作为该类的一个属性。
如果在多个lambda表达式中使用相同的变量,他们会共享该变量值。
5、线程死锁(deadlock)
使用lock关键字对资源进行锁定,使用不当可能会发生线程资源死锁。
lock关键字是Monitor类的语法糖,包含Monitor.Enter及Monitor.Exit的封装。
使用Monitor.TryEnter方法可以尝试对指定资源的访问,若超时则返回false,可以进行下一步处理。
6、线程异常
线程内部的异常不会被启动线程的代码块捕获到。
一般来说,不要在线程中抛出异常,而是在线程代码中使用try/catch代码块。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器