C#线程基础(线程启动和停止)

目录

一、关于线程

二、示例 

三、生成效果


一、关于线程

        在使用多线程前要先引用命名空间System.Threading,引用命名空间后就可以在需要的地方方便地创建并使用线程。

        创建线程对象的构造方法中使用了ThreadStart()委托,当线程开始执行时,将会执行委托中定义的方法。通过IsBackground属性设置线程为后台线程,调用线程对象的Start方法启动线程,开始执行。CancellationToken方法终止线程。

         创建的线程分为前台线程和后台线程,通过线程对象的IsBackground属性可以设置线程为前台线程或后台线程。前台线程与后台线程的区别是,后台线程不会使托管程序处于运行状态。也就是说,如果进程停止所有前台线程,那么系统会认为此进程处于非运行状态,将会停止所有后台线程并关闭。

        适当地使用线程,可以增加程序的运行效率,使程序运行更加流畅,但是线程间的同步问题也显得尤为重要,可以使用线程锁或监视器有效地处理线程同步问题。

二、示例 

// 线程技术
// 使用随机对象产生一个1~100之间的整数,单击“开始”时,动态生成100个按钮并开始计时;
// 单击事件:按钮上的数字<随机数,那么被单击的按钮变为红色,并显示字符串“小”;
// 单击事件:按钮上的数字>随机数,那么被单击的按钮变为红色,并显示字符串“大”;
// 单击事件:按钮上的数字=随机数就会弹出消息框,提示已经猜对了数字,并显示用时及猜测次数。
namespace _033
{public partial class Form1 : Form{private Button? button1;private Label? label1;private Label? label2;private Label? label3;private Label? label4;Thread? thread_1;                    //定义线程readonly Random random_num = new();  //定义随机数对象int Temp_int_num;                    //定义变量用于存放存机数public Form1(){InitializeComponent();Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{Location = new Point(30, 22),Name = "button1",Size = new Size(75, 23),TabIndex = 0,Text = "开始",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // label1// label1 = new Label{AutoSize = true,Location = new Point(206, 28),Name = "label1",Size = new Size(44, 17),TabIndex = 1,Text = "计时:"};// // label2// label2 = new Label{AutoSize = true,Location = new Point(256, 28),Name = "label2",Size = new Size(0, 17),TabIndex = 2};// // label3// label3 = new Label{AutoSize = true,Location = new Point(305, 28),Name = "label3",Size = new Size(20, 17),TabIndex = 3,Text = "秒"};// // label4// label4 = new Label{AutoSize = true,Location = new Point(115, 28),Name = "label4",Size = new Size(43, 17),TabIndex = 4,Text = ""};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(379, 426);Controls.Add(label4);Controls.Add(label3);Controls.Add(label2);Controls.Add(label1);Controls.Add(button1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "猜数字";FormClosed += Form1_FormClosed;}private void Button1_Click(object? sender, EventArgs e){RemoveControl();               //清空所有无用对象int bt_int_x = 10;             //X坐标初始值为10int bt_int_y = 60;             //Y坐标初始值为60for (int i = 0; i < 100; i++)  //添加100个按钮{Button bt = new(){Text = (i + 1).ToString(),  //设置button按钮的文本值Name = (i + 1).ToString(),  //设置button按钮的Name属性Width = 35, Height = 35,   Location = new Point(bt_int_x, bt_int_y)//设置button按钮的位置};bt.Click += new EventHandler(Bt_Click);     //定义button按钮的事件bt_int_x += 36;                             //设置下一个按钮的位置if ((i + 1) % 10 == 0)                      //每10个按钮就换行{bt_int_x = 10;      //换行后重新设置X坐标bt_int_y += 36;   //换行后重新设置Y坐标}Controls.Add(bt);   //将button按钮放入窗体控件集合中}thread_1 = new Thread(delegate ()       //新建一条线程使用匿名方法{int P_int_count = 0;            //初始化计数器while (true)                    //开始无限循环{P_int_count = ++P_int_count > 100000000 ? 0 : P_int_count;  //计数器累加Invoke(                     //将代码交给主线程执行(MethodInvoker)delegate //使用匿名方法{label2!.Text = P_int_count.ToString(); //窗体中显示计数});Thread.Sleep(1000);    //线程睡眠1秒}}){IsBackground = true            //设置线程为后台线程};thread_1.Start();                  //开始执行线程Temp_int_num = random_num.Next(1, 100);//生成随机数label4!.Text = "随机数=" + Temp_int_num.ToString( );button1!.Enabled = false;          //停用开始按钮}/// <summary>/// 强行关闭窗体/// </summary>private void Form1_FormClosed(object? sender, FormClosedEventArgs e){Environment.Exit(0);}/// <summary>/// 开始遍历100个按钮/// 清空窗体中动态生成的按钮/// </summary>void RemoveControl(){for (int i = 0; i < 100; i++){if (Controls.ContainsKey((i + 1).ToString()))   //窗体中是否有此按钮{for (int j = 0; j < Controls.Count; j++)    //遍历窗体控件集合{if (Controls[j].Name == (i + 1).ToString())//是否查找到按钮{Controls.RemoveAt(j);                  //删除指定按钮break;}}}}}/// <summary>/// 用于查找窗体中Enable属性为False控件的数量/// 用于计算玩家有多少次没有猜中/// </summary>/// <returns>返回没有猜中数量</returns>string GetCount(){int P_int_temp = 0;                 //初始化计数器foreach (Control c in Controls)     //遍历控件集合{if (!c.Enabled) P_int_temp++;   //计数器累加}return P_int_temp.ToString();       //返回计数器信息}void Bt_Click(object? sender, EventArgs e){Control? P_control = sender as Control; //将sender转换为control类型对象if (int.Parse(P_control!.Name) > Temp_int_num){P_control.BackColor = Color.Red;     //设置按钮背景为红色P_control.Enabled = false;           //停用按钮P_control.Text = "大";               //更改按钮文本}if (int.Parse(P_control.Name) < Temp_int_num){P_control.BackColor = Color.Red;     //设置按钮背景为红色P_control.Enabled = false;           //设置按钮停用P_control.Text = "小";               //更改按钮文本}if (int.Parse(P_control.Name) == Temp_int_num){//thread1.Abort();CancellationToken cancellationToken = new();CancellationToken token = cancellationToken;Thread_Abort(token);MessageBox.Show(string.Format("恭喜你猜对了!共猜了{0}次 用时{1}秒",GetCount(), label2!.Text), "恭喜!");  //显示游戏信息button1!.Enabled = true;                   //启用开始按钮}}/// <summary>/// 用于代替thread1!.Abort();/// SYSLIB0006:不支持 Thread.Abort/// 替代方案我没有深究是否有效,仅提供指明的解决方向/// </summary>static void Thread_Abort(CancellationToken cancellationToken){         // If the CancellationToken is marked as "needs to cancel",// this will throw the appropriate exception.cancellationToken.ThrowIfCancellationRequested();}}
}

三、生成效果

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)

甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…

微信小程序-入门

文章目录 微信小程序1. 基础知识1.1 小程序的定义和特点1.2 小程序的架构1.3 小程序的目录结构和文件类型1.4 小程序源文件解析1.4.1 app.json文件1.4.2 project.config.json文件1.4.3 sitemap.json文件 微信小程序 微信小程序开发工具下载&#xff1a; 微信官方文档&#xf…

【深度学习-图像分类】02 - AlexNet 论文学习与总结

论文地址&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 论文学习 1. 摘要 本研究训练了一个大型深度卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用于对ImageNet LSVRC-2010比赛中的1.2百万高分辨率图像进行分类&#xff0c;这些图…

十大排序总结之——冒泡排序、插入排序

同样&#xff0c;这两几乎也是被淘汰了的算法&#xff0c;尽管它们是稳定的&#xff0c;但是时间复杂度没人喜欢&#xff0c;了解一下就好&#xff0c;没啥好说的&#xff0c;注意最后一句话就行了 一&#xff0c;冒泡排序 1. 算法步骤 共n-1趟&#xff0c;谁两敢冒泡就换了…

Stable Diffusion API入门:简明教程

Stable Diffusion 是一个先进的深度学习模型&#xff0c;用于创造和修改图像。这个模型能够基于文本描述来生成图像&#xff0c;让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API&#xff0c;通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界…

相机内参标定理论篇------相机模型选择

相机种类&#xff1a; 当拿到一款需要标定内参的相机时&#xff0c;第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格&#xff0c;一般来说根据相机FOV可以把相机大概分为以下几类&#xff1a; 长焦相机&#xff1a;< 标准相机&#xff1a;~&…

2022年全国职业院校技能大赛(高职组)“云计算”赛项赛卷①第一场次:私有云

2022年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算”赛项赛卷1 第一场次&#xff1a;私有云&#xff08;30分&#xff09; 目录 2022年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算”赛项赛卷1 第一场次&#xff1a;私有云&#xff0…

千里马2023年终总结-android framework实战

背景&#xff1a; hi粉丝朋友们&#xff1a; 2023年马上就过去了&#xff0c;很多学员朋友也都希望马哥这边写个年终总结&#xff0c;因为这几个月时间都忙于新课程halsystracesurfaceflinger专题的开发&#xff0c;差点都忘记了这个事情了&#xff0c;今天特别花时间来写个bl…

最优化方法Python计算:无约束优化应用——神经网络回归模型

人类大脑有数百亿个相互连接的神经元&#xff08;如下图(a)所示&#xff09;&#xff0c;这些神经元通过树突从其他神经元接收信息&#xff0c;在细胞体内综合、并变换信息&#xff0c;通过轴突上的突触向其他神经元传递信息。我们在博文《最优化方法Python计算&#xff1a;无约…

SpringMVC框架

SpringMVC 三层架构MVC模式SpringMVC入门案例总结 三层架构 表现层&#xff08;web&#xff09; 页面数据的收集&#xff0c;产出页面 业务逻辑层&#xff08;service&#xff09; 业务处理 数据访问层&#xff08;Dao&#xff09; 数据持久化 MVC模式 SpringMVC 基于Java…

影视后期:PR 调色处理,灰片还原,校色偏色素材

灰片还原 确定拍摄灰片的相机型号品牌官网下载专用log文件LUT-浏览-导入slog3分析亮部波形-增加画面对比分析矢量示波器-提高整体饱和 校正LUT可以将前期拍摄的log色彩模式的视频转换为成709色彩模式&#xff0c;即将灰度视频转换为正常效果(灰片还原) 各个相机有对应的校正L…

开源预约挂号平台 - 从0到上线

文章目录 开源预约挂号平台 - 从0到上线演示地址源码地址可以学到的技术前端技术后端技术部署上线开发工具其他技术业务功能 项目讲解前端创建项目 - 安装PNPM - 使用VSCODE - 安装插件首页顶部与底部 - 封装组建 - 使用scss左右布局中间内容部分路由 - vue-routerBANNER- 走马…

RFC6749-OAuth2.0

前言 最近在项目中需要实现SSO(单点登录)功能,以实现一处注册,即可在任何平台之间登录的功能。我们项目中并没有直接对接第三方认证系统而是通过集成keycloak 完成一系类安全协议的对接工作。如果我们在代码级别自己完成各种安全协议的对接是一项十分大的工程。不仅要走统一的…

jsp介绍

JSP 一种编写动态网页的语言&#xff0c;可以嵌入java代码和html代码&#xff0c;其底层本质上为servlet,html部分为输出流&#xff0c;编译为java文件 例如 源jsp文件 <% page contentType"text/html; charsetutf-8" language"java" pageEncoding&…

Django 学习教程-介绍与安装

系列 Django 学习教程- Hello world入门案例-CSDN博客 介绍 Django 是一个由 Python 编写用于Web 应用程序开发的高级 Python Web 框架 Django 提供了一套强大的工具&#xff08;无需重新发明轮子&#xff09;&#xff0c;使得开发者能够快速构建 Web 网站。 Django 采用了…

【每日一题】收集巧克力

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;枚举操作数 写在最后 Tag 【枚举】【数组】【2023-12-28】 题目来源 2735. 收集巧克力 题目解读 有长度为 n, 下标从 0 开始的整数数组 nums, 表示收集不同类型的巧克力的成本. nums[i] 表示收集类型 i 巧克力的成本…

linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控

一、安装 Docker 和 Docker Compose https://docs.docker.com/get-docker/ # 安装 Docker sudo apt-get update sudo apt-get install -y docker.io# 安装 Docker Compose sudo apt-get install -y docker-compose二、创建配置文件及测试平台是否正常 1、选个文件夹作为自建…

simulink代码生成(六)——多级中断的配置

假如系统中存在多个中断&#xff0c;需要合理的配置中断的优先级与中断向量表&#xff1b;在代码生成中&#xff0c;要与中断向量表对应&#xff1b;中断相关的知识参照博客&#xff1a; DSP28335学习——中断向量表的初始化_中断向量表什么时候初始化-CSDN博客 F28335中断系…

WPF Button使用漂亮 控件模板ControlTemplate 按钮使用控制模板实例及源代码 设计一个具有圆角边框、鼠标悬停时颜色变化的按钮模板

续前两篇模板文章 模板介绍1 模板介绍2 WPF中的Button控件默认样式简洁&#xff0c;但可以通过设置模板来实现更丰富的视觉效果和交互体验。按钮模板主要包括背景、边框、内容&#xff08;通常为文本或图像&#xff09;等元素。通过自定义模板&#xff0c;我们可以改…

jmeter的常用功能及在测试中的基本使用和压测实战

Jmeter基础功能 了解Jmeter的常用组件 元件&#xff1a;多个类似功能组件的容器&#xff08;类似于类&#xff09; 一&#xff1a;Test Plan&#xff08;测试计划&#xff09; 测试计划通常用来给测试的项目重命名&#xff0c;使用多线程脚本运行时还可以配置线程组运行方式…