C#(五十二)之线程

news2024/12/25 0:01:52

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。

C#线程操作,需要使用到Thread类。

使用命名空间

using System.Threading;

下表列出了 Thread 类的一些常用的 属性

属性

描述

CurrentContext

获取线程正在其中执行的当前上下文。

CurrentCulture

获取或设置当前线程的区域性。

CurrentPrinciple

获取或设置线程的当前负责人(对基于角色的安全性而言)。

CurrentThread

获取当前正在运行的线程。

CurrentUICulture

获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。

ExecutionContext

获取一个 ExecutionContext 对象,

该对象包含有关当前线程的各种上下文的信息。

IsAlive

获取一个值,该值指示当前线程的执行状态。

IsBackground

获取或设置一个值,该值指示某个线程是否为后台线程。

(线程未停止时才好用)

IsThreadPoolThread

获取一个值,该值指示线程是否属于托管线程池。

ManagedThreadId

获取当前托管线程的唯一标识符。

Name

获取或设置线程的名称。

Priority

获取或设置一个值,该值指示线程的调度优先级。

ThreadState

获取一个值,该值包含当前线程的状态。

下表列出了 Thread 类的一些常用的 方法:

序号

方法名 & 描述

1

public void Abort()
  在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。

调用此方法通常会终止线程。

2

public static LocalDataStoreSlot AllocateDataSlot()
  在所有的线程上分配未命名的数据槽。为了获得更好的性能,

请改用以 ThreadStaticAttribute   属性标记的字段。

3

public static LocalDataStoreSlot AllocateNamedDataSlot(   string name) 
  在所有线程上分配已命名的数据槽。为了获得更好的性能,请改用以   ThreadStaticAttribute 属性标记的字段。

4

public static void BeginCriticalRegion()
  通知主机执行将要进入一个代码区域,在

该代码区域内线程中止或未经处理的异常的影响可能会危害应用程序域中的其他任务。

5

public static void BeginThreadAffinity()
  通知主机托管代码将要执行依赖于当前物理操作系统线程的标识的指令。

6

public static void EndCriticalRegion()
  通知主机执行将要进入一个代码区域,在该代码区域内线程中止或未经处理的异常仅影响当前任务。

7

public static void EndThreadAffinity()
  通知主机托管代码已执行完依赖于当前物理操作系统线程的标识的指令。

8

public static void FreeNamedDataSlot(string name)
  为进程中的所有线程消除名称与槽之间的关联。为了获得更好的性能,

请改用以 ThreadStaticAttribute 属性标记的字段。

9

public static Object GetData( LocalDataStoreSlot slot   ) 
  在当前线程的当前域中从当前线程上指定的槽中检索值。为了获得更好的性能,

请改用以 ThreadStaticAttribute 属性标记的字段。

10

public static AppDomain GetDomain()
  返回当前线程正在其中运行的当前域。

11

public static AppDomain GetDomainID()
  返回唯一的应用程序域标识符。

12

public static LocalDataStoreSlot GetNamedDataSlot(   string name ) 
  查找已命名的数据槽。为了获得更好的性能,请改用以   ThreadStaticAttribute 属性标记的字段。

13

public void Interrupt()
  中断处于 WaitSleepJoin 线程状态的线程。

14

public void Join()
  在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,

直到某个线程终止为止。此方法有不同的重载形式。

15

public static void MemoryBarrier()
  按如下方式同步内存存取:执行当前线程的处理器在对指令重新排序时,

不能采用先执行 MemoryBarrier 调用之后的内存存取,再执行 MemoryBarrier 调用之前的内存存取的方式。

16

public static void ResetAbort()
  取消为当前线程请求的 Abort。

17

public static void SetData( LocalDataStoreSlot slot,   Object data ) 
  在当前正在运行的线程上为此线程的当前域在指定槽中设置数据。为了获得更好的性能,

请改用以 ThreadStaticAttribute 属性标记的字段。

18

public void Start()
  开始一个线程。

19

public static void Sleep( int millisecondsTimeout   ) 
  让线程暂停一段时间。

20

public static void SpinWait( int iterations ) 
  导致线程等待由 iterations 参数定义的时间量。

21

public static byte VolatileRead( ref byte address )
  public static double VolatileRead( ref double address )
  public static int VolatileRead( ref int address )
  public static Object VolatileRead( ref Object address ) 

  读取字段值。无论处理器的数目或处理器缓存的状态如何,

该值都是由计算机的任何处理器写入的最新值。此方法有不同的重载形式。这里只给出了一些形式。

22

public static void VolatileWrite( ref byte address,   byte value )
  public static void VolatileWrite( ref double address, double value )
  public static void VolatileWrite( ref int address, int value )
  public static void VolatileWrite( ref Object address, Object value ) 

  立即向字段写入一个值,以使该值对计算机中的所有处理器都可见。

此方法有不同的重载形式。这里只给出了一些形式。

23

public static bool Yield()
  导致调用线程执行准备好在当前处理器上运行的另一个线程。由操作系统选择要执行的线程。

线程优先级(ThreadPriority):

Highest:最高

AboveNormal:第二高

Normal:默认级别

BelowNormal:较低

Lowest:最低

插入线程优先运行插入自身及插入之上的线程

static void Main(string[] args)
        {
            // 委托
            ThreadStart th = new ThreadStart(function);
            Thread threadA = new Thread(th);
            // 匿名委托
            Thread threadB = new Thread(delegate()
            {
                for (int i = 0; i < 500000000; i++)
                {
                    if (i % 1000000 == 0)
                    {
                        Console.WriteLine("B");
                    }
                   
                }
                // 插入线程
                threadA.Join();
                // 主线程
                for (int i = 0; i < 500000000; i++)
                {
                    if (i % 1000000 == 0)
                    {
                        Console.WriteLine("主线程结束");
                    }
                }
            });
            // 设置线程优先级
            //threadA.Priority = ThreadPriority.AboveNormal;
            //threadB.Priority = ThreadPriority.BelowNormal;
            // 开启线程
            threadA.Start();
            threadB.Start();
           
            Console.ReadKey();
        }

打印结果:AAABBBAAABBB……主线程结束主线程结束主线程结束主线程结束主线程结束

C# ThreadState属性

这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程。

C# ThreadState属性的取值如下:    

Aborted:线程已停止;    

AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止;    

Background:线程在后台执行,与属性Thread.IsBackground有关;    

Running:线程正在正常运行;    

Stopped:线程已经被停止;    

StopRequested:线程正在被要求停止;    

Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行);    

SuspendRequested:线程正在要求被挂起,但是未来得及响应;    

Unstarted:未调用Thread.Start()开始线程的运行;    

WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态;

 实例:

private void button3_Click(object sender, EventArgs e)
        {
            Thread ss = new Thread( delegate(){
                Console.WriteLine("325432432");
            });
            string res = ss.ThreadState.ToString();
            ss.Start();
            res = ss.ThreadState.ToString();
            label1.Text = res;
        }

IsBackground:设置或取值,是否是后台线程,必须在线程运行的时候才好用

后台线程在应用程序关闭时,线程也随之关闭。他不会妨碍程序的运行

private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                ss.IsBackground = true;
                res = ss.ThreadState.ToString();
                label1.Text = res;
            }
            catch (Exception qq)
            {
                MessageBox.Show(qq.Message);
            }
        }

IsAlive:线程是否启动。返回true/false

private void button7_Click(object sender, EventArgs e)
        {
            try
            {
                res = ss.IsAlive.ToString();
                label1.Text = res;
            }
            catch (Exception qq)
            {
                MessageBox.Show(qq.Message);
            }
        }

测试使用全部代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;
 
namespace Threads
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public string path ;
        public Thread th;
 
        /// <summary>
        /// 加载函数
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
           
        }
 
        /// <summary>
        /// 打开文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                path = textBox1.Text.Trim();
                if (path == "")
                {
                    MessageBox.Show("请输入文件路径");
                }
                if (File.Exists(path))
                {
                    OpenFile();
                }
                else
                {
                    MessageBox.Show("文件不存在");
                }
            }
            catch (Exception qq)
            {
 
                MessageBox.Show(qq.Message);
            }
        }
        /// <summary>
        /// 打开文件
        /// </summary>
        public void OpenFile()
        {
            string content = File.ReadAllText(path);
        }
 
        /// <summary>
        /// 打开线程
        /// </summary>
        public void OpenThread()
        {
            int a = 1;
            ThreadStart aaa = new ThreadStart(OpenFile);
            th = new Thread(aaa);
 
 
        }
 
        public void LookThread()
        {
            ///th.CurrentThread;
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            LookThread();
        }
 
        public Thread ss;
        public string res;
 
        // d
        private void button3_Click(object sender, EventArgs e)
        {
            ss = new Thread( delegate(){
                for (int i = 0; i < 1000000000000; i++)
                {
                    Console.WriteLine(i);
                }
            });
            res = ss.ThreadState.ToString();
            ss.Start();
            res = ss.ThreadState.ToString();
            label1.Text = res;
        }
 
        private void Stop_Click(object sender, EventArgs e)
        {
            ss.Abort();
            res = ss.ThreadState.ToString();
            label1.Text = res;
 
        }
 
        private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                ss.IsBackground = true;
                res = ss.ThreadState.ToString();
                label1.Text = res;
            }
            catch (Exception qq)
            {
                MessageBox.Show(qq.Message);
            }
        }
 
        private void button7_Click(object sender, EventArgs e)
        {
            try
            {
                res = ss.IsAlive.ToString();
                label1.Text = res;
            }
            catch (Exception qq)
            {
                MessageBox.Show(qq.Message);
            }
        }
       
    }
}

有好的建议,请在下方输入你的评论。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

grafana+prometheus+pushgateway+flink可视化实时监控

文章目录 一、各部分介绍二、安装配置1、安装pushgateway2、安装Prometheus3、Grafana 安装 三、测试使用 一、各部分介绍 采集层 flink APP和linux system两部分&#xff0c;是我们要收集指标数据的组件传输层 Pushgateway&#xff1a;是一个推送收集和推送数据的组件 Node_ex…

【网络安全带你练爬虫-100练】第5练:爬虫的翻页操作+错误情况过滤

目录 一、翻页分析&#xff1a; 二、代码逻辑 1、入口程序修改 2、page参数传入 三、完整代码 1、运行结果 2、错误分析&#xff1a; 3、缺陷代码&#xff1a; 4、完善逻辑&#xff1a; 5、完善代码&#xff1a; &#xff08;说在前面&#xff0c;任何逻辑都有很多方…

Python软件安装后,Scripts文件夹下为空解决办法

安装Python后&#xff0c;需要使用pip&#xff0c;发现Scripts下为空&#xff0c;无法install pip: 解决办法&#xff1a; cmd进入Windows命令提示符界面&#xff0c;进入Python的安装目录&#xff0c;并使用python -m ensurepip命令执行即可&#xff1a;

R语言——字符串处理

paste(abc, def, gh, sep ) #粘贴字符串 substr(abcdefg, 2, 3) # 取特定字符串 gsub(abc, , c(abc, abcc, abcbc)) # 将字符串中abc替换为空 strsplit(a;b;c, ;, fixed T) # 按照;切分字符串 strsplit(a222b2.2c, 2.2, fixed F) # 按照正则表达式分隔&#xff0c;这里的.是…

15.1 BP神经网络实现图像压缩——了解神经网络在图像处理方面的应用(matlab程序)

1.简述 BP神经网络现在来说是一种比较成熟的网络模型了,因为神经网络对于数字图像处理的先天优势,特别是在图像压缩方面更具有先天的优势,因此,我这一段时间在研究神经网络的时候同时研究了一下关于BP网络实现图像压缩的原理和过程,并且是在MATLAB上进行了仿真的实验,结果发现设…

Java:ThreadLocal解析

Java&#xff1a;ThreadLocal解析 前言一、 什么是ThreadLocal&#xff1f;二、ThreadLocal的内存泄漏问题1.什么是内存泄漏&#xff1f;2.为什么会出现内存泄漏问题&#xff1f;3.如何解决内存泄漏问题&#xff1f;&#xff08;1&#xff09;ThreadLocal会自动清除key为null的…

层级在BW4HANA中的处理

目录 1.从flatfile加载层级的处理 2. 从ERP数据源抽取区间层级到BW 2.1 在ERP中的层级数据源 2.1.1 PSA格式和IDoc格式的区别 2.1.2 怎么查看Interval的字段 2.1.3 如何在S4里查看层级数据源结构 2.1.4 关于时间相关层级date to和date from 1.从flatfile加载层级的处理 层…

【快速开始】一个简单的Flask-SocketIO应用,完成后端推送消息接收与关闭

效果图 先看运行效果图 OK&#xff0c;下面开始。 安装环境 本人使用环境及版本&#xff1a; Anaconda&#xff1a; 虚拟环境&#xff1a; Python版本&#xff1a;3.8.13 安装包及版本&#xff1a; Flask-SocketIO&#xff1a;5.3.4 eventlet&#xff1a;0.33.3 快速开…

BUU [ZJCTF 2019]NiZhuanSiWei

BUU [ZJCTF 2019]NiZhuanSiWei 先看题目&#xff0c;提示了useless.php。 猜到了flag在哪。 没啥可以学的&#xff0c;直接上exp。 ?textdata://text/plain,welcome to the zjctf &filephp://filter/readconvert.base64-encode/resourceuseless.php &passwordO:4:&q…

工作学习总结:安卓地图SDK测试--前置准备阶段8天

工作学习总结&#xff1a;安卓地图SDK测试--前置准备阶段8天 安卓地图SDK测试--前置准备阶段8天前置知识&#xff1a;1、安卓环境开发部署2、高德 SDK demo 如何进行调试&#xff08;1&#xff09;SHA1 密钥无法获取&#xff08;2&#xff09;下载了高德 3D 地图 demo&#xff…

Leetcode---352周赛

周赛题目 2760. 最长奇偶子数组 2761. 和等于目标值的质数对 2762. 不间断子数组 2763. 所有子数组中不平衡数字之和 一、最长奇偶子数组 这题的数据范围允许用暴力来做&#xff0c;只要我们分别枚举左端点left和右端点right&#xff0c;然后看区间[left,right]是否符合题目条…

stable diffusion 百宝书

文章目录 0. 环境搭建0.1 Windows0.1.1 git环境安装0.1.2 python 环境搭建0.1.2.1 配置pip国内镜像源 0.1.3 stable diffusion环境搭建0.1.3.1 远程访问Stable diffusion0.1.3.2 模型 Lora下载 1. 基础知识1.1 Stable Diffusion Webui及基础参数1.2 参数说明1.2.1 采样方法1.2.…

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B 简介环境配置环境搭建依赖安装 代码及模型权重拉取拉取 Chinese-LLaMA-Alpaca拉取 llama-30b-hf 模型权重及代码拉取 chinese-llama-lora-33b 模型权重及代码 合并模型权重先转换 pth 类型的模型权重&…

docker版jenkins安装node打包vue2

下载node 通过jenkins配置下载因为某些原因会失败&#xff0c;故自己下载安装https://nodejs.org/zh-cn/download解压然后复制到docker的jenkins容器 tar -xvf node-v16.18.1-linux-x64.tar.xzdocker cp ./node-v16.18.1-linux-x64 jenkins:/node配置 jenkins-全局工具配置- …

【Vim编辑器】编码技巧:模板(自动添加信息)+配置参考(~/.vimrc)

前言&#xff1a; 在编写代码时&#xff0c;为了提高代码的可读性和维护性&#xff0c;我们经常在文件的头部添加一些信息提示&#xff0c;如作者、日期、版本号等。本文介绍了如何在 Vim 编辑器中实现自动添加信息提示的功能。 结尾提供~/.vimr参考配置&#xff0c;可提高代码…

短视频seo矩阵+抖音小程序源码开源部署(二)

一、 开发思路&#xff1a; 通过短视频seo矩阵抖音小程序的形式&#xff0c;实现视频的批量制作&#xff0c;小程序内容批量挂载&#xff0c;客户线索批量收集&#xff0c;实现企业运营价值最大化。开发逻辑&#xff1a;通过短视频矩阵布局seo搜索关键词&#xff0c;接入小程序…

Elasticsearch:文档版本控制和乐观并发控制

在今天的文章中&#xff0c;我来详细描述一下 Elasticsearch 文档的版本控制以及如何更新文档。你也可以阅读我之前的文章 “Elasticsearch&#xff1a;深刻理解文档中的 verision 及乐观并发控制”。 版本控制 我们知道 Elasticsearch 的每个文档都有一个相对应的版本。这个版…

GO微服务简介及特性介绍

微服务特性 一、微服务简介-构建单体应用 互联网技术发展迅速的今天&#xff0c;微服务倍受关注&#xff1a;文章、博客、社交媒体讨论和会议演讲都在谈论。与此同时&#xff0c;也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构的…

Windows系统安装JAVA步骤流程(超详细)

超详细的Windows系统安装JAVA步骤流程&#xff0c;Windows操作系统安装java&#xff0c;先下载JDK&#xff0c;然后配置环境变量&#xff0c;阿里云百科分享详细安装流程如下&#xff1a; 目录 Window操作系统安装java流程 下载JDK 配置环境变量 JAVA_HOME 设置 PATH设置…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…