C#多线程的操作

news2024/11/16 7:29:45

文章目录

  • 1 使用线程意义
  • 2 C#线程开启的四种方式
    • 2.1 异步委托开启线程
    • 2.2 通过Thread类开启线程
    • 2.3 通过线程池开启线程
    • 2.4 通过任务Task开启线程
  • 3 前台线程和后台线程简述
    • 3.1 前台线程
    • 3.2 后台线程
  • 4 简述Thread和Task开启线程的区别
    • 4.1 Thread效果展示
    • 4.2 Task效果展示
    • 4.3 区别说明

1 使用线程意义

在软件开发的过程中会很频繁的用到线程(Thread),在线程使用的过程中总是能出现“这样”或者“那样”的问题。线程被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果应用程序涉及到复杂的和耗时的操作,设置不同的线程执行路径往往是有益的,让每个线程执行特定的工作。使用线程不仅能节省 CPU 周期的浪费,同时也会提高应用程序的效率。

               **话不多说开始 上 干 货 !!!**

2 C#线程开启的四种方式

2.1 异步委托开启线程

//线程池可以看做容纳线程的容器;一个应用程序最多只能有一个线程池;ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池; 每排入一个工作函数,就相当于请求创建一个线程;
//线程池的作用:
//1、线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
//2、如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止
public static void Thread_3(string[] args)
{
   ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool), new string[] { "hjh" });
   Console.ReadKey();
}
public static void TestThreadPool(object state)
{
   string[] arry = state as string[];//传过来的参数值
   int workerThreads = 0;
   int CompletionPortThreads = 0;
   ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);
   Console.WriteLine(DateTime.Now.ToString() + "---" + arry[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);
}

2.2 通过Thread类开启线程


private void Thread_2()
{
   Thread  t1 = new Thread(SetInfo1);
   t1.Start();
}

private void SetInfo1()
{
          Console.WriteLine("奇数为" + i);
}

2.3 通过线程池开启线程

#region 3.通过线程池开启线程
//线程池可以看做容纳线程的容器;一个应用程序最多只能有一个线程池;ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池; 每排入一个工作函数,就相当于请求创建一个线程;
//线程池的作用:
//1、线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
//2、如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止
public static void Thread_3(string[] args)
{
   ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool), new string[] { "hjh" });
   Console.ReadKey();
}
public static void TestThreadPool(object state)
{
   string[] arry = state as string[];//传过来的参数值
   int workerThreads = 0;
   int CompletionPortThreads = 0;
   ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);
   Console.WriteLine(DateTime.Now.ToString() + "---" + arry[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);
}

2.4 通过任务Task开启线程

public static void Thread_4(string[] args)
{
   Task task = new Task(DownLoadFile_My);
   task.Start();
   Console.ReadKey();
}
static void DownLoadFile_My()
{
   Console.WriteLine("开始下载...线程ID:" + Thread.CurrentThread.ManagedThreadId);
   Thread.Sleep(500);//模拟耗时的操作
   Console.WriteLine("下载完成!");
}

3 前台线程和后台线程简述

我们关闭一个应用程序,但是进程在资源管理器中依然存在,就是由于存在前台线程未关闭导致的。可以设置前台线程修改为后台线程(设置Thread.IsBackground 属性)。

不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。

应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

3.1 前台线程

  1. 应用程序必须在所有前台线程处理完毕后方可退出;
  2. 前台线程一般处理等待时间较长的任务;
  3. 应用程序的主线程以及使用Thread开启的线程都默认为前台线程。

3.2 后台线程

  1. 应用程序退出时不用考虑后台线程是否已经运行完毕,直接退出进程;
  2. 一般用后台线程去处理等待时间较短的任务;
  3. 通过异步委托、线程池(ThreadPool.QueueUserWorkItem())和Task开启的线程都默认为后台线程;

4 简述Thread和Task开启线程的区别

4.1 Thread效果展示

 StringBuilder text = new StringBuilder();
 new Thread(() =>
 {
     for (int i = 0; i < 5; i++)
     {
         new Thread(() =>
         {
             var threadId = Thread.CurrentThread.ManagedThreadId;
             text.AppendLine(threadId.ToString());
         }).Start();
         Thread.Sleep(1000);
     }
     MessageBox.Show(text.ToString(),"打印线程ID");
 }).Start();

在这里插入图片描述

4.2 Task效果展示

StringBuilder text = new StringBuilder();

new Task(() =>
{
    for (int i = 0; i < 5; i++)
    {
        new Task(() =>
        {
            var threadId = Thread.CurrentThread.ManagedThreadId;
            text.AppendLine(threadId.ToString());
        }).Start();
        Thread.Sleep(1000);
    }
    MessageBox.Show(text.ToString(),"打印线程ID");
}).Start();

在这里插入图片描述

4.3 区别说明

从3.1和3.2中我们看到这两种方式开启线程后,线程的ID是有明显的不同的。
其实Task 是基于 Thread 的,是比较高层级的封装,Task 最终还是需要 Thread 来执行,使用Thread 开启的线程默认使用前台线程,而Task 默认使用后台线程。

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

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

相关文章

2013年10月23日 Go生态洞察:字符串、字节、符文和字符

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

瑞吉外卖Day04

1.文件的上传下载 Value("${reggie.path}")private String basePath;/*** 文件上传** param file* return*/PostMapping("/upload")public R<String> upload(MultipartFile file) {log.info("文件上传");//原始文件名String originalFilen…

22款奔驰E260L升级原厂360全景影像 高清环绕的视野

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…

基于安卓android微信小程序的师生答疑交流平app

项目介绍 本课题研究的是基于HBuilder X系统平台的师生答疑交流APP&#xff0c;开发这款师生答疑交流APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了师生答疑交流APP的界面设计及使用&#xff0c;主要包括界面的实现、控件的使用、界面的布局和异常…

macOS btop

brew install btop参考 5 个 htop 替代&#xff1a;增强你的 Linux 系统监控体验btop github

Git本地项目提交到Gitee的操作流程

一、Gitee创建一个仓库 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a;复制该仓库地址&#xff08;https://gitee.com/yassels/test_1115.git&#xff09;&#xff0c;留待后续使用 二、操作本地文件上传到Gitee 第一步&#xff1a; 第二步…

[NSSRound#7 Team]ShadowFlag

文章目录 前置知识/proc目录python的反弹shellpin码计算 解题步骤 前置知识 /proc目录 Linux系统上的/proc目录是一种文件系统&#xff0c;用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息&#xff0c;甚至可以通过更改其中某些文件来改变内核的运行状态。/pro…

Spring全家桶源码解析--2.2 Spring bean 的创建

文章目录 前言一、Bean 的生成过程&#xff1a;1.1 创建过程&#xff1a;1.1.1 doGetBean 创建bean1.1.2 单例bean 创建getSingleton&#xff1a;1.1.3 单例bean 创建createBean&#xff1a;1.1.4 单例bean 创建doCreateBean&#xff1a;1.1.5 bean 实例化和初始化之后factoryB…

PostGIS学习教程六:几何图形(geometry)

文章目录 一、介绍二、元数据表三、表示真实世界的对象3.1、点&#xff08;Points&#xff09;3.2、线串&#xff08;Linestring&#xff09;3.3、多边形&#xff08;Polygon&#xff09;3.4、图形集合&#xff08;Collection&#xff09; 四、几何图形输入和输出五、从文本转换…

Mysql中的索引与事务和B树的知识补充

索引与事务和B树的知识补充 一.索引1.概念2.作用3.使用场景4.使用 二.事务1.为什么使用事务2.事务的概念3.使用3.1脏读问题3.2不可重复读3.3 幻读问题3.4解决3.5 使用代码 三.B树的知识补充1.B树2.B树 一.索引 1.概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记…

C++基础知识记录

github仓库不定期更新: https://github.com/han-0111/CppLearning 文章目录 C如何工作编译器和链接器编译器预处理(Preprocessing)includedefineif/endif 链接器一种比较复杂的情况 变量变量类型intcharshortlonglong longfloatdoublebool如何查看数据大小 函数头文件条件语句…

使用 sCrypt CLI 工具验证合约

通过向 Whatsonchain 提交合约源代码可以实现合约的验证。 另外一种方法是使用 sCrypt CLI 工具来验证合约。 You can verify the deployed smart contracts script using the verify command: scrypt verify <scriptHash> <contractPath>第一个位置参数是已部署…

博客系统页面设计

目录 前言 1.预期效果 1.1博客列表页效果 1.2博客详情页效果 1.3博客登陆页效果 2.实现博客列表页 2.1实现导航栏 2.2实现版心 2.3实现个人信息 2.4实现博客列表 3.实现博客正文页 3.1引入导航栏 3.2引入版心 3.3引入个人信息 3.4实现博客正文 4.实现博客登陆页…

javascript原来还可以这样比较两个日期(直接使用new Date)

有个需求是这样的&#xff1a;假设今天是2023/11/15 有一个表格&#xff0c;表格中操作列按钮的展示与隐藏依靠开始结束日期来进行展示&#xff0c;如果当前日期在开始结束日期之间&#xff0c;则进行展示&#xff0c;我一开始做的时候使用new Date转换成时间戳(getTime)进行比…

7天入门python系列之爬取热门小说项目实战,互联网的东西怎么算白嫖呢

第七天 Python项目实操 编者打算开一个python 初学主题的系列文章&#xff0c;用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python&#xff0c;这是一个紧凑的学习计划。但并不是不可完成的。 学到第7天说明你已经对python有了一…

生活消费分销系统搭建开发制作

文章目录 前言 一、生活消费系统是什么&#xff1f;二、生活消费分销系统的营销方式和功能三、总结 一、生活消费系统介绍 生活消费系统涵盖了吃喝玩乐&#xff0c;衣食住行。网购消费等生活消费的优惠券领取以及分销功能 二、生活消费分销系统的营销方式和功能 A: 会员体…

基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的影城管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍…

【Proteus仿真】【Arduino单片机】DS18B20温度计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DS18B20温度传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器采集温度。 二、软件设计 /*…

Android抓包工具—Fiddler详解

前言 平时和其他大佬交流时&#xff0c;总会出现这么些话&#xff0c;“抓个包看看就知道哪出问题了”&#xff0c;“抓流量啊&#xff0c;payload都在里面”&#xff0c;“这数据流怎么这么奇怪”。 &#x1f449;这里出现的名词&#xff0c;其实都是差不多的意思啊&#xf…

leetcode:1576. 替换所有的问号(python3解法)

难度&#xff1a;简单 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#xff0c;不存…