多线程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代码块。

浙公网安备 33010602011771号