当前位置: 首页 > news >正文

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();}}
}

三、生成效果

 

相关文章:

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

目录 一、关于线程 二、示例 三、生成效果 一、关于线程 在使用多线程前要先引用命名空间System.Threading&#xff0c;引用命名空间后就可以在需要的地方方便地创建并使用线程。 创建线程对象的构造方法中使用了ThreadStart()委托&#xff0c;当线程开始执行时&#xff0c…...

如何利用ChatGPT来提高编程效率

如何利用ChatGPT来提高编程效率 在当今这个信息爆炸和技术快速发展的时代,程序员们面临着巨大的压力,既要保证代码的质量,又要提高工作效率。幸运的是,人工智能(AI)正在改变我们编写和维护代码的方式,而OpenAI的ChatGPT是其中的佼佼者。本文将讨论如何利用ChatGPT以及结合…...

java智慧工地源码,互联网+建筑工地,实现对工程项目内人员、车辆、安全、设备、材料等的智能化管理

智慧工地全套源码&#xff0c;微服务JavaSpring Cloud UniApp MySql&#xff1b;支持多端展示&#xff08;大屏端、PC端、手机端、平板端&#xff09;演示自主版权。 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&…...

创建并使用自己的C++模块(Windows10+MSVC)

module是C20种新引入的特性&#xff0c;关于module的介绍和好处&#xff0c;网上已有大量的文章&#xff0c;此处也不再赘述&#xff0c;本文仅记录在个人的环境上创建一个简单的module并使用这个module。 环境同上一篇文章&#xff08; windows10&#xff0c;MSVC C工具链&am…...

Spring Boot 2.7.11 集成 GraphQL

GraphQL介绍 GraphQL&#xff08;Graph Query Language&#xff09;是一种用于API的查询语言和运行时环境&#xff0c;由Facebook于2012年创建并在2015年公开发布。与传统的RESTful API相比&#xff0c;GraphQL提供了更灵活、高效和强大的数据查询和操作方式。 以下是GraphQL…...

软件工程期末总结

软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…...

MidTool图文创作-GPT-4与DALL·E 3的结合

GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型&#xff0c;它在前代模型的基础上进行了大幅度的改进&#xff0c;不仅在文本生成的连贯性、准确性上有了显著提升&#xff0c;还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…...

Python将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起

将两个或多个列表合并为一个列表&#xff0c;并根据每个输入列表中的元素的位置将其组合在一起。 这个需求在实际开发过程中应该说非常常见&#xff0c;当然python也给我们内置了相关方法&#xff01; zip(*iterables, strictFalse) 在多个迭代器上并行迭代&#xff0c;从每…...

数模混合SoC芯片中LEF2Milkyway的golden flow

在数模混合芯片中的项目中&#xff0c;特别是数字模块很少甚至只有一个简单的数字控制逻辑时&#xff0c;我们要做数字模块的后端实现时&#xff0c;通常模拟那边会问我们实现需要他们提供哪些数据。 通常来说&#xff0c;我们可以让模拟设计提供数字模块的GDS或LEF文件即可。…...

Five tips to make your essay flow

This post was written by Sydney Nicholson, a second-year master’s student in the English Department. Dear writer, Have you ever wondered what it takes to make an essay “flow”? In my time as a writing center tutor, I’ve noticed that this is one of th…...

linux驱动(二):led补

本文主要探讨s5pv210的led驱动相关知识&#xff0c;包括驱动主次设备注册和取消&#xff0c;udev(mdev)机制&#xff0c;静态和动态映射操作寄存器。 字符设备驱动注册 老接口(register_chrdev) static inline int register_chrdev(unsigned int major, const char *n…...

性能测试-jmeter:安装 / 基础使用

一、理解jmeter 官网-Apache JMeter-Apache JMeter™ JMeter是一款开源的性能测试工具&#xff0c;主要用于模拟大量用户并发访问目标服务器&#xff0c;以评估服务器的性能和稳定性。 JMeter可以执行以下任务序号用途描述1性能测试通过模拟多个用户在同一时间对服务器进行请…...

数据仓库-数仓优化小厂实践

一、背景 由于公司规模较小&#xff0c;大数据相关没有实现平台化&#xff0c;相关的架构都是原生的Apache组件&#xff0c;所以集群的维护和优化都需要人工的参与。根据自己的实践整理一些数仓相关的优化。 二、优化 1、简易架构图 2、ODS层优化 2.1 分段式解析 随着业务增长…...

uniapp中uview组件丰富的Code 验证码输入框的使用方法

目录 基本使用 #自定义提示语 #保持倒计时 API #Props #Methods #Event 基本使用 通过ref获取组件对象&#xff0c;再执行后面的操作&#xff0c;见下方示例。 通过seconds设置需要倒计的秒数(默认60)通过ref调用组件内部的start方法&#xff0c;开始倒计时通过监听cha…...

md文件图片上传方案:Github+PicGo 搭建图床

文章目录 1. PicGo 下载2. 配置Github3. 配置PicGo4. PicGo集成Typora4.1 picGo监听端口设置 5. 测试 1. PicGo 下载 下载地址&#xff1a;https://molunerfinn.com/PicGo/ 尽量下载稳定版本 2. 配置Github 1. 创建一个新仓库&#xff0c;用于存放图片 2. 生成一个token&a…...

从零开始 - 在Python中构建和训练生成对抗网络(GAN)模型

生成对抗网络&#xff08;GANs&#xff09;是一种强大的生成模型&#xff0c;可以合成新的逼真图像。通过完整的实现过程&#xff0c;读者将对GANs在幕后的工作原理有深刻的理解。本教程首先导入必要的库并加载将用于训练GAN的Fashion-MNIST数据集。然后&#xff0c;提供了构建…...

OfficeWeb365 Indexs 任意文件读取漏洞复现

0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 /Pi…...

Crypto的简单应用-前后端加密传输

最近遇到一个数据脱敏处理的需求&#xff0c;想要用一种轻量级的技术实现&#xff0c;必须足够简单并且适用于所有场合如前后端加密传输、路由加密、数据脱敏等。抽时间研究了一下Crypto加密库的一些API&#xff0c;发现完全符合上述需求&#xff0c;扩展也比较容易。 1、前端加…...

Vue3-32-路由-重定向路由

什么是重定向 路由的重定向 &#xff1a;将匹配到的路由 【替换】 为另一个路由。 redirect : 重定向的关键字。 重定向的特点 1、重定向是路由的直接替换,路由的地址是直接改变的&#xff1b; 2、在没有子路由配置的情况下&#xff0c;重定向的路由可以省略 component 属性的配…...

如何用js动态修改字体大小

在项目中&#xff0c;我们常常会遇到使用v-html渲染文本的情况。 如果需要点击大中小三个字号按钮&#xff0c;需要修改字体的大小。那我们应该怎么做呢 function fontSize(element, type) {let size {big: 22,middle: 16,small: 12};var result element.innerHTML.replac…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...