C#——多线程之Thread

news2024/9/19 10:35:46

C#——多线程之Thread

  • 前言
  • 一、Thread是什么?
  • 二、各应用场景以及实例分析
    • 1.前台线程和后台线程:
    • 2.异步处理
    • 3.线程状态及手动销毁线程
    • 4.线程同步/等待线程完成
  • 总结


前言

上次简单讲述了关于多线程中Task的相关应用以及场景。今天我们来看一下多线程中Thread的使用以及相关注意事项。


一、Thread是什么?

Thread 类是在 .NET Framework 中用于创建和管理线程的基本类。==它允许您在应用程序中创建多个线程,每个线程都可以独立地执行任务。==虽然使用 Thread 类可以实现多线程编程,但在实际开发中,更常用的是使用更高级别的抽象,例如 Task 和异步/等待模式 (async/await),它们提供了更方便和安全的线程管理方式。

一些注意事项与案例:

  1. 前台线程和后台线程
  2. 异步处理
  3. 线程状态及手动销毁线程

二、各应用场景以及实例分析

1.前台线程和后台线程:

默认情况下,线程是前台线程,即使主线程退出,前台线程仍会继续执行(此时当线程中内容是个循环的时候,线程就会一直进行,直到关机)。后台线程则会随着主线程的退出而结束。可以使用 IsBackground 属性来设置线程是否为后台线程。

代码如下(示例):

Thread thread = new Thread(WorkerMethod);
thread.IsBackground = true; // 设置为后台线程
thread.Start();

2.异步处理

同样的,一些耗时的处理,放到线程中进行处理。

代码如下(示例):

        Thread t;
        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(thread);
            t.Start();

            Thread t2 = new Thread(new ThreadStart(() =>					//并不会立马执行,也需要用Start进行启动。
            {
                while (true)
                {
                    Console.WriteLine("Thread 2.");
                    Thread.Sleep(1000);
                }
            }));

            t2.Start();
        }
        
        void thread() 
        {
            try
            {
                int num = 0;
                while (true)
                {
                    num += 1;
                    Console.WriteLine($"当前次数{num}");
                    Thread.Sleep(1000);
                }
            }
            catch (ThreadAbortException taEx)
            {
                Console.WriteLine("Thread Abort Exeption!");
            }
            finally 
            {
                Console.WriteLine("Into Finally!");
            }

        }

结果如图:
在这里插入图片描述

3.线程状态及手动销毁线程

线程在其生命周期中会处于不同的状态,通过 ThreadState 枚举来表示。

一些常见的线程状态包括:

  • Unstarted:线程已创建但未启动。
  • Running:线程正在运行中。
  • WaitSleepJoin:线程正在等待、睡眠或参与其他线程。
  • Stopped:线程已停止运行。
  • Aborted:线程已被强制终止。

线程销毁:

  • 线程在执行完任务后会自动退出,无需手动销毁。
  • 在必要情况下,可以使用 Abort() 方法强制终止线程的执行,但不推荐使用,因为这样可能会导致资源泄漏或不稳定的状态。

手动销毁线程:

        private void button2_Click(object sender, EventArgs e)
        {
            t.Abort();
        }

Abort() 销毁线程。通过抛出 threadabortexception 在运行时中止线程。代码看2.异步处理处thread()方法。

结果显示:
在这里插入图片描述

4.线程同步/等待线程完成

多个线程之间的执行顺序可能会导致意外的结果。使用 Thread.Join() 方法等待线程执行完成。

        Thread t;
        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(thread);
            t.IsBackground = true;
            t.Start();
            t.Join();
            Console.WriteLine("End");
        }

        void thread() 
        {
            Console.WriteLine("Will wait 2S");
            Thread.Sleep(2000)
        }

结果显示:
在这里插入图片描述

很多时候,线程中的程序是一直循环的,所以无法用join进行等待同步,此时可以在流程中加入全局bool变量去控制流程。


总结

上文我们通过各实例内容,粗略了解了Thread的相关应用,同样的在使用中还会遇见多种问题,在此无法详尽的列举出来。在以后的过程中,如果遇见问题的话我会陆续更新到这里,希望本文对大家有所帮助。下次我们将继续了解Task和Thread的区别及使用时的选择事项。我们下次再见。

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

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

相关文章

这就是ChatGPT,走进我们的生活!

这就是ChatGPT,走进我们的生活! 早在年初,合作导师将我叫过去,让我了解学习一下ChatGPT,看能不能对我们的生活有所帮助。一直使用着国内镜像,五月份我才注册了OpenAI的账户。如今,打开购物商城购…

安全测试国家标准解读——并发程序安全

本系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解,该标准是2020年4月28日,由国家市场监督管理总局、国家标准化管理委员会发布,2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理&#xff…

leetcode 134. 加油站

2023.7.31 这题直观思路是暴力法&#xff0c;用一个for循环遍历所有起点&#xff0c;判断哪个起点能走回来。 不过最后有几个很阴间的示例通过不了&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {f…

SpringBoot使用MyBatis Plus + 自动更新数据表

1、Mybatis Plus介绍 Mybatis&#xff0c;用过的都知道&#xff0c;这里不介绍&#xff0c;mybatis plus只是在mybatis原来的基础上做了些改进&#xff0c;增强了些功能&#xff0c;增强的功能主要为增加更多常用接口方法调用&#xff0c;减少xml内sql语句编写&#xff0c;也可…

编写Java代码制造一个内存溢出的情况

编写Java代码制造一个内存溢出的情况 这将会是一篇比较邪恶的文章&#xff0c;当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在java的世界里&#xff0c;内存溢出仅仅只是你在这种情况下可能会引入的一种bug。你的受害者会在办公室里度过几天甚至是几周的不眠之夜…

IO流(3)—转换流与打印流

目录 1. 为什么要用到转换流&#xff1f; 2. 字符输入转换流&#xff08;重点掌握&#xff09; 3. 字符转换输出流&#xff08;理解即可&#xff09; 4. 认识打印流 5. 打印流的作用 6. PrintStream如何使用&#xff1f; 7. PrintStream 内部没有缓冲区 8. PrintWriter…

四、Spring源码-DI的过程

Spring源码-DI的过程 接下来我们分析下Spring源码中Bean初始化过程中的DI过程。也就是属性的依赖注入。 一、构造参数依赖 1. 如何确定构造方法 在Spring中生成Bean实例的时候默认是调用对应的无参构造方法来处理。 Component public class BeanK {private BeanE beanE;priv…

LUN映射出错导致写操作不互斥的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 某公司的光纤SAN存储系统&#xff0c;6块硬盘组建一组RAID6&#xff0c;划分若干LUN&#xff0c;MAP到不同的SOLARIS操作系统服务器上。 服务器故障&分析&#xff1a; 由于业务增长需要新增应用&#xff0c;工作人员增加了一台IBM服务器&am…

共享麻将室开启无人值守新潮流

共享麻将室是指一种基于共享经济模式&#xff0c;将麻将室资源进行共享的服务&#xff0c;为用户提供舒适、方便的娱乐场所。通过共享麻将室&#xff0c;用户可以按需预约和使用麻将室&#xff0c;享受社交娱乐的同时&#xff0c;减少了个人投资和管理麻将室的成本。 相比传统麻…

kotlin 编写一个简单的天气预报app(二)增加搜索城市功能

增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市&#xff0c;在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…

puppeteer代理的搭建和配置

puppeteer代理的搭建和配置 本文深入探讨了Puppeteer在网络爬虫和自动化测试中的重要角色&#xff0c;着重介绍了如何搭建和配置代理服务器&#xff0c;以优化Puppeteer的功能和性能。文章首先介绍了Puppeteer作为一个强大的Headless浏览器自动化工具的优势和应用场景&#xf…

【嵌入式学习笔记】嵌入式入门1——GPIO

1.什么是GPIO General Purpose Input Output&#xff0c;即通用输入输出端口&#xff0c;简称GPIO&#xff0c;作用是负责采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出。 2.STM32 GPIO简介 2.1.GPIO特点 不同型号&#xff0c;IO口数量可能不一样&#x…

企业如何在线编写一份优秀的产品说明文档?

编写一份优秀的产品说明文档对于企业来说非常重要&#xff0c;它可以帮助用户理解产品的功能、使用方法和优势&#xff0c;提高用户体验和满意度。下面是一些关键的步骤和建议&#xff0c;帮助企业在线编写一份优秀的产品说明文档。 一、明确目标受众 在编写产品说明文档之前…

搞活系列-Java NIO之偏偏不用buffer.flip()会出现什么问题?

最近看博客又看到了Java NIO相关的博客&#xff0c;其中有讲解NIO和传统IO关于文件复制的文章&#xff0c;看到了如下的代码&#xff1a; /**** channel用例* 基于channel的文件复制*/Testpublic void fileCopyByChannel(){try {FileInputStream fileInputStream new FileInpu…

MyBatis小记_one

目录 什么是框架 1.框架的概述 2.框架要解决的问题 3. 软件开发的分层重要性 4.分层开发的常见框架 MyBatis 框架概述 JDBC 编程的回顾 JDBC 问题分析 MyBatis 框架快速入门 1.官网下载MyBatis框架jar包 2.搭建MyBatis 开发环境 3. 编写持久层接口的映射文件 IUserD…

Stable Diffusion 使用教程

环境说明&#xff1a; stable diffusion version: v1.5.1python: 3.10.6torch: 2.0.1cu118xformers: N/Agradio: 3.32.0 1. 下载 webui 下载地址&#xff1a; GitHub stable-diffusion-webui 下载 根据自己的情况去下载&#xff1a; 最好是 N 卡&#xff1a;&#xff08;我的…

计数排序算法

计数排序 计数排序说明&#xff1a; 计数排序&#xff08;Counting Sort&#xff09;是一种非比较性的排序算法&#xff0c;它通过统计元素出现的次数&#xff0c;然后根据元素出现的次数将元素排列在正确的位置上&#xff0c;从而实现排序。计数排序适用于非负整数或者具有确…

使用vue creat搭建项目

一、查看是否安装node和npm&#xff08;显示版本号说明安装成功&#xff09; node -v npm -v 显示版本号说明安装成功&#xff0c;如果没有安装&#xff0c;则需要先安装。 二、安装vue-cli脚手架 查看安装的版本&#xff08;显示版本号说明安装成功&#xff09; vue -V 三…

纯JS+Vue实现一个仪表盘

在使用canvas的时候发现数值变化&#xff0c;每次都要重新渲染&#xff0c;值都从0开始&#xff0c;这和我的需求冲突。 1. 先绘制基本的圆环背景&#xff0c;利用border-color和border-radius将正方形变成基本的圆环。 <div class"circle"><div class&qu…

使用toad对数据进行分箱处理

Toad 是专为工业界模型开发设计的Python工具包&#xff0c;特别针对评分卡的开发。Toad 的功能覆盖了建模全流程&#xff0c;从 EDA、特征工程、特征筛选到模型验证和评分卡转化。Toad 的主要功能极大简化了建模中最重要最费时的流程&#xff0c;即特征筛选和分箱。 导入模型包…