C#笔记11 获取线程及其信息,什么是优先级、单元状态、线程状态、执行状态、线程名称以及其他属性?

news/2024/9/18 7:52:18/ 标签: 笔记, 开发语言, c#, 学习, .net

前文讲完了在C#中线程怎么创建,怎么删除,怎么启动,怎么阻止。

现在来看看线程本身的属性。

当前线程

首先要获得当前线程,才能获取线程信息,此属性用于获取当前运行的线程。此属性可用于获取代码当前执行所在的线程。

public static System.Threading.Thread CurrentThread { get; }

 展示线程信息的方法代码:

private static void ShowThreadInformation(String taskName){String msg = null;Thread thread = Thread.CurrentThread;lock(lockObj) {msg = String.Format("{0} thread information\n", taskName) +String.Format("   Background: {0}\n", thread.IsBackground) +String.Format("   Thread Pool: {0}\n", thread.IsThreadPoolThread) +String.Format("   Thread ID: {0}\n", thread.ManagedThreadId);}Console.WriteLine(msg);}

 中间涉及很多没学的内容,暂且不提。

单元状态

一个过时的属性。

非过时的替代方法包括用于检索单元状态的 GetApartmentState 方法和用于设置单元状态的 SetApartmentState 方法。

In .NET Framework versions 1.0 and 1.1, the property marks a thread to indicate that it will execute in a single-threaded or multithreaded apartment. This property can be set when the thread is in the or thread state; however, it can be set only once for a thread. If the property has not been set, it returns :ApartmentStateUnstartedRunningUnknown

大意为:在  .NET Framework versions 1.0 and 1.1中,它标识着一个线程是启动一个单线程还是多线程的一部分。这个属性标记线程以指示它将在单线程或多线程单元中执行。当它处于or线程状态时可以被设置,(这里我没理解)它为一个线程只能设定一次。如果没有设定,他会返回:ApartmentStateUnstartedRunningUnknown 状态。

线程状态

在代码中这个状态经常用在判断条件中。

Thread.ThreadState

指示当前线程状态的 ThreadState 值之一。初始值为 Unstarted。

ThreadState 属性提供比 IsAlive 属性更具体的信息。具体可取值为枚举值:

中止	256	Aborted
线程状态包括 AbortRequested,线程现在已死,但其状态尚未更改为 Stopped。中止请求	128	AbortRequested
已在线程上调用 Abort(Object) 方法,但线程尚未收到将尝试终止它的挂起 ThreadAbortException。后台	4	Background
该线程作为后台线程执行,而不是作为前台线程执行。此状态通过设置 IsBackground 属性来控制。运行	0	Running
线程已启动,但尚未停止。停止	16	Stopped
线程已停止。停止请求	1	StopRequested
正在请求线程停止。这仅供内部使用。暂停	64	Suspended
线程已暂停。暂停请求	2	SuspendRequested
正在请求线程暂停。未启动	8	Unstarted
尚未在线程上调用 Start() 方法。等待睡眠加入	32	WaitSleepJoin
线程被阻塞。这可能是调用 Sleep(Int32) 或 Join()、请求锁(例如,通过调用 Enter(Object) 或 Wait(Object, Int32, Boolean))或等待线程同步对象(如 ManualResetEvent)的结果。

IsAlive执行状态

不常用的一个属性。一个布尔值。

如果此线程已启动,但未正常终止或中止,此时为true;
否则。false

线程名称

public string? Name { get; set; }

string类型,包含线程名称的字符串或 null(如果未设置名称)。

一般我们不怎么使用这个属性,你可以给线程添加名称以增强其在线程管理中的可读性,在添加之前可以与null比较,来知晓是否已经命名过,如果已经命名就调取当前名称。

线程优先级

public System.Threading.ThreadPriority Priority { get; set; }

代表线程在调度过程中的优先级,默认值为Normal。

在公共语言运行库内创建的线程将分配Normal,而在公共运行库外创建的线程在进入公共运行库中将保留之前的优先级。

  1. CLR内部创建的线程

    • 当在CLR内部创建线程时(例如,使用 Thread 类),CLR会自动将线程的优先级设置为 Normal
    • CLR还提供了一种机制来更改线程的优先级,但这种更改通常是在运行时进行的,而不是在创建线程时。
  2. CLR外部创建的线程

    • 如果您在CLR外部创建线程(例如,使用 CreateThread API),这些线程在进入CLR之前具有由操作系统定义的优先级。
    • 当这些线程开始执行CLR代码时,它们将保留之前的优先级。这意味着CLR外部创建的线程不会自动变为 Normal 优先级。

 不同操作系统调度的算法不同,对于优先级的处理也不尽相同。

可能的取值:

AboveNormal	3	BelowNormal	1	Highest	4	Lowest	0	Normal	2	高于正常	3	
Thread 可以调度在具有Highest优先级的线程之后,和具有Normal优先级的线程之前。低于正常值	1	
Thread 可以调度在具有Normal优先级的线程之后,和具有Lowest优先级的线程之前。最高	4	
可以将 Thread 调度在具有任何其他优先级的线程之前。最低	0	
可以将 Thread 调度在具有任何其他优先级的线程之后。正常	2	
Thread 可以调度在具有AboveNormal优先级的线程之后和具有BelowNormalNormal优先级的线程之前。默认情况下,线程具有此优先级。

 开发时我们可以使用这个属性获取和设置该线程的优先级。

除此之外

其他属性


public System.Globalization.CultureInfo CurrentCulture { get; set; }
此属性返回的 CultureInfo 对象及其关联对象确定日期、时间、数字、货币值、文本的排序顺序、大小写约定和字符串比较的默认格式。请参阅 CultureInfo 类,了解区域性名称和标识符、固定区域性、非特定区域性和特定区域性之间的差异,以及区域性信息影响线程和应用程序域的方式。public static System.Security.Principal.IPrincipal? CurrentPrincipal { get; set; }
获取或设置线程的当前负责人(对基于角色的安全性而言)public System.Threading.ExecutionContext? ExecutionContext { get; }
获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。public bool IsBackground { get; set; }
获取或设置一个值,该值指示线程是否为后台线程。public bool IsThreadPoolThread { get; }
获取一个值,该值指示线程是否属于托管线程池。public int ManagedThreadId { get; }
一个整数,表示此托管线程的唯一标识符。

线程可以是后台线程,也可以是前台线程。后台线程与前台线程相同,不同之处在于后台线程不会阻止进程终止。属于某个进程的所有前台线程终止后,公共语言运行时将结束该进程。任何剩余的后台线程都将停止并且不会完成

默认情况下,以下线程在前台执行(即,其 IsBackground 属性返回):false

  1. 主线程(或主应用程序线程)。
  2. 通过调用 Thread 类构造函数创建的所有线程。

默认情况下,以下线程在后台执行(即,其 IsBackground 属性返回):true

  1. 线程池线程,这是由运行时维护的工作线程池。您可以使用 ThreadPool 类配置线程池并计划线程池线程上的工作。
  2. 从非托管代码进入托管执行环境的所有线程。

注:基于任务的异步操作会在线程池线程上自动执行。

 线程的标识符不会随着时间变化改变。


http://www.ppmy.cn/news/1526022.html

相关文章

qt下两种方式读取opencv 图片各个通道的值

qt下两种方式读取opencv 图片各个通道的值 Mat srcImg imread("D:\\1.jpg");if(srcImg.empty()){QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");return;}Mat imgShow ;cvtColor(srcImg, imgSho…

企微机器人:企业数字化转型的得力助手

在数字化转型的浪潮中,企业对于提高运营效率、降低人力成本的需求日益迫切。企微机器人,作为基于企业微信平台开发的一种智能工具,以其高度自动化、灵活性强、安全性高和易于使用的特点,迅速成为企业内部的得力助手。本文将深入探…

udp的广播,多播,单播 demo

enum class EMsgType:uint8_t { EMSGT_SINGLE,//单播 EMSGT_MULTICAST,//多播 EMSGT_BROADCAST,//广播 }; sendSocket new QUdpSocket(this); sendSocket->setSocketOption(QAbstractSocket::MulticastTtlOption, 1); sendSocket->bind(QHostAddress::AnyIPv4, 0,QUdpSoc…

Qt 弹出菜单右键菜单 QMenu 设置不同颜色的子项

概述 在Qt中,可以使用样式表(StyleSheet)来自定义 QMenu 的外观,包括其子项(如菜单项QAction)的颜色。但是,这通常可以设置 QMenu 的整体样式,而不能单独设置某个子项的颜色。不过&…

Redis:处理缓存穿透的两种方法

缓存穿透:客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不能生效,请求都会直接发送到数据库 解决方案: 1.缓存空对象 查完数据库后,将该数据以空值缓存进redis中,同时增加命中时对命中空值的判…

【乐吾乐大屏可视化组态编辑器】使用手册

1 总览 开始设计:大屏可视化设计器 - 乐吾乐Le5le 1.1 画布 画布即绘画区域,将图形拖拽到画布进行编辑,绘制大屏。 1.2 菜单栏 顶部菜单导航,一级菜单可设置Logo、公司名称、文件编辑、常用编辑、查看、帮助,设置大…

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录: (1)拆单接口 (2)取消订单业务补充关闭支付记录 (3)支付宝关闭交易 (4)查询支付交易记录 (5)PaymentFeignClient 远程接口 &#xff08…

【Kubernetes】常见面试题汇总(十)

目录 29.简述 Kubernetes 自动扩容机制? 30.简述 Kubernetes Service 类型? 31.简述 Kubernetes Service 分发后端的策略? 32.简述 Kubernetes Headless Service ? 29.简述 Kubernetes 自动扩容机制? (…

828华为云征文 | 华为云X实例服务器上部署知识图谱项目的详细指南

前言 知识图谱作为数据整合、语义分析和人工智能的重要基础,逐渐被广泛应用于各类领域。其通过结构化数据和关系映射,帮助用户更好地理解数据背后的意义。要成功构建和部署知识图谱项目,强大的计算资源和高效的存储查询能力至关重要。华为云X…

【App】React Native

React Native 的优势: 开发体验好 用统一的代码规范开发移动端程序,不用关注移动端的差异.开发成本低 开发一次,可以生成 Android 和 IOS 俩个系统上的 App学习成本低 只要掌握 JavaScript 和 React 就可以进行移动端开发 React Native 的不…

可解释性机器学习中的局部解释

可解释性机器学习可以被分成两大类,第一大类叫做局部的解释,第二大类叫做全局的 解释,如图 1 所示。局部的解释是,比如有一个图像分类器,输入一张图片,它会判断出 是一只猫,机器要回答问题是为什…

SpringCloud Alibaba入门简介

1、诞生 2018.10.31,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。 2、是什么,去哪下 官网:Spring Cloud Alibaba官网_基于Springboot的微服务教程-阿里云-阿里云Spring Cloud …

Python(PyTorch)和MATLAB及Rust和C++结构相似度指数测量导图

🎯要点 量化检查图像压缩质量低分辨率多光谱和高分辨率图像实现超分辨率分析图像质量图像索引/多尺度结构相似度指数和光谱角映射器及视觉信息保真度多种指标峰值信噪比和结构相似度指数测量结构相似性图像分类PNG和JPEG图像相似性近似算法图像压缩,视频…

C# WinForm:禁用Panel容器滚动条自动移动位置的功能

1.在WinForm项目中新建一个类: 2.类里面的内容,重写Panel的这个方法 3.编译后这个控件就出现在工具箱了 4.然后用这个新Panel控件就好了 5.完事大吉。

【JVM】类加载过程|双亲委派模型

目录 四、类加载过程 1.类加载过程 2.双亲委派模型(经典面试题) 什么是双亲委派模型 双亲委派模型的优点 破坏双亲委派模型 四、类加载过程 1.类加载过程 咱们写的java代码,是.java文件(硬盘),一个j…

【Kubernetes】服务账号 Service Account

《K8s 的安全认证》系列,共包含以下文章: K8s 的安全框架和用户认证K8s 的鉴权管理(一):基于角色的访问控制(RBAC 鉴权)K8s 的鉴权管理(二):基于属性 / 节点…

8K回报率10枚自定义按键,PC游戏丝滑操作,雷柏VT1 Pro MAX鼠标体验

现在喜欢玩PC游戏的朋友越来越多,《黑神话:悟空》等3A游戏也吸引到了更多的新玩家,想要完美运行此类游戏,不仅需要高性能的电脑硬件,还需要操控精准、反应敏捷的鼠标、键盘等外设。前端时间雷柏推出了VT1系列鼠标&…

“Fast-forward“ in git-pull result

当你执行 git pull 并且结果显示 Fast-forward 时,这意味着你的本地分支可以直接快进到远程分支的最新提交,没有任何冲突或者需要合并的内容。具体来说,Fast-forward 是一种合并方式,它的特点是将当前分支的指针直接移动到远程分支…

python解析ip范围,判断ip是否在ip范围内

目录 1. 背景 2. 代码使用示例 2.1 分割ip,横杠 (-) 的ip范围 2.2 判断ip在掩码(/)的范围内 2.3 判断ip在横杠(-)的范围内 2.3.1 格式:192.168.1.1-192.168.1.10 2.3.2 格式&…

idea连接数据库大避雷!!!

再跟着黑马学习的时候,用黑马的资料安装的数据库,命令行能正常启动,SQLyog也能正常连接,就是tmd idea连接不了。不论是原始的jdbc,还是其它方式都不行,一直报错: 然后就各种搜,有的说数据库驱动…