C#多线程的操作

文章目录

  • 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.rhkb.cn/news/192763.html

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

相关文章

ssm823基于ssm的心理预约咨询管理系统的设计与实现+vue

ssm823基于ssm的心理预约咨询管理系统的设计与实现vue 交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

一本了解生成式人工智能

上周&#xff0c;发了一篇关于大语言模型图数据库技术相结合的文章&#xff0c;引起了很多朋友的兴趣。当然了&#xff0c;这项技术本身就让俺们很兴奋&#xff0c;比如我就是从事图研发的&#xff0c;当然会非常关注它在图领域的应用与相互促就啦。 纵观人类文明历史&#xff…

Postman+Newman+Jenkins实现接口测试持续集成

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 1.新建一个项目 2.设置自定义工作空间 3.执行windows的批处理命令 4.执行系统的Groovy脚本 5.生成的HTML的报告集成到Jenkin…

大模型的全面回顾,看透大模型 | A Comprehensive Overview of Large Language Models

大模型的全面回顾&#xff1a;A Comprehensive Overview of Large Language Models 返回论文和资料目录 论文地址 1.导读 相比今年4月的中国人民大学发表的大模型综述&#xff0c;这篇综述角度更侧重于大模型的实现&#xff0c;更加硬核&#xff0c;更适合深入了解大模型的一…

MongoDB分片集群搭建

----前言 mongodb分片 一般用得比较少&#xff0c;需要较多的服务器&#xff0c;还有三种的角色 一般把mongodb的副本集应用得好就足够用了&#xff0c;可搭建多套mongodb复本集 mongodb分片技术 mongodb副本集可以解决数据备份、读性能的问题&#xff0c;但由于mongodb副本集是…

ai语音电销机器人电销行业要怎么降低封号率?

工信部对电话营销电话的管控越来越严格&#xff0c;企业电销行业的发展受到了很多限制&#xff0c;因为电话销售人员在进行销售工作的时候&#xff0c;经常会因为各种原因触发封号机制&#xff0c;导致手机卡号被封&#xff0c;那企业电销行业要怎么降低封号率&#xff1f; 很多…

应届裁员,天胡开局——谈谈我的前端一年经历

应届裁员&#xff0c;天胡开局——谈谈我的前端一年经历 许久没有更新了&#xff0c;最近一个月都在忙&#xff0c;没错&#xff0c;正如题目所说&#xff0c;裁员然后找工作… 这周刚重新上班&#xff0c;工作第二天&#xff0c;感慨良多&#xff0c;记录些什么吧。 去年十…

普通测径仪升级的智能测径仪 增添11大实用功能!

普通测径仪能对各种钢材进行非接触式的外径及椭圆度在线检测&#xff0c;测量数据准确且无损&#xff0c;可测、监测、超差提示、系统分析等。在此基础上&#xff0c;为测径仪进行了进一步升级制成智能测径仪&#xff0c;为其增添更多智能化模块&#xff0c;让其使用更加方便。…

PHP 论文发表管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 论文发表管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 论文发表系统1 代码 https://download.csdn.net/download/qq_412213…

Vim + YCM + clangd

目录 1. Vim的安装 1.1 Vim安装vim-plug2. 安装YCM3. 进行语言补全配置 3.1 测试效果 1. 目的&#xff1a;让 Vim 像 C/C IDE 一样具备自动补全代码等功能 2. YCM&#xff1a;YouCompleteMe GitHub - ycm-core/YouCompleteMe: A code-completion engine for Vi…

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述&#xff1a; 抗D盾是新一代的智能分布式云接入系统&#xff0c;接入节点采用多机房集群部署模式&#xff0c;隐藏真实服务器IP&#xff0c;类似于网站CDN的节点接入&#xff0c;但是“抗D盾”是比CDN应用范围更广的接入方式&#xff0c;适合任何TCP 端类应用包括&am…

04-学成在线之系统管理服务模块之查询数据字典表中的内容,前后端联调测试

前后端联调 配置前端环境 实际开发中先由后端工程师将接口设计好并编写接口文档并交给前端工程师&#xff0c;前后端的工程师就开始并行开发 前端开发人员先自己mock数据即使用假数据进行开发,当后端代码完成后前端工程师尝试请求后端接口获取数据然后渲染到页面 第一步: 首…

Vue事件绑定

目录 前言 Vue事件处理 指令的语法格式 事件绑定指令—v-on 回调函数 前言 我们知道如何在原生js中实现事件绑定&#xff0c;那在vue中如何实现呢&#xff1f; Vue事件处理 指令的语法格式 <标签 v-指令名&#xff1a;参数名"表达式">{{插值语法}}</…

图识单链表

CSDN主页&#xff1a;醋溜马桶圈_C语言进阶,初始C语言,数据结构-CSDN博客 Gitee主页&#xff1a;mnxcc (mnxcc) - Gitee.com 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 我们之前学习了顺序表的有关知识&#xff0c;顺序表存在下面的问题&#xff1a; 尾插效率还不错…

SQL-LABS

less8 and 11-- 12 发现存在注入点 接下来我们会接着用联合查询 和以往的题目不一样没显错位&#xff0c;也就是没有报错的内容&#xff0c;尝试用盲注 布尔型 length&#xff08;&#xff09;返回长度 substr&#xff08;&#xff09;截取字符串&#xff08;语法substr&a…

冷空气已发货,户外作业者请做好足部保暖

冷空气不间断 多地体验一夜入冬 据中国天气网消息 冷空气正在马不停蹄发货 三分之二国土需羽绒服护体 同时记得做好足部保暖。 在寒风凛冽的冬日中&#xff0c;对于常年在户外工作人员的群体来说&#xff0c;又到了一年里最难熬的时节。他们不畏严寒&#xff0c;在零度以下…

C#中.NET Framework4.8 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录

目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET Framework4.8 控制台应用中通过EF访问已有数据库&#xff0c;事实上在.NET Framework4.8 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样&#xff0c;数据库EF模型和上下文…

TikTok与心灵成长:娱乐与启发并重

社交媒体已成为我们生活的一部分&#xff0c;其中TikTok以其短视频内容和创新性而闻名。然而&#xff0c;TikTok不仅仅是一个娱乐平台&#xff0c;它还具有潜力成为心灵成长的有力工具。本文将探讨TikTok如何在娱乐与启发之间取得平衡&#xff0c;以促进心灵成长和积极影响。 娱…

大环境之下软件测试行业趋势能否上升?

如果说&#xff0c;2021年对于全世界来说&#xff0c;都是一场极大的挑战的话&#xff1b;那么&#xff0c;2022年绝对是机遇多多的一年。众所周知&#xff0c;随着疫情在全球范围内逐步得到控制&#xff0c;无论是国际还是国内的环境&#xff0c;都会呈现逐步回升的趋势&#…

阿里云国际站:密钥管理服务

文章目录 一、密钥管理服务的概念 二、密钥管理服务的功能 三、密钥管理服务的优势 一、密钥管理服务的概念 密钥管理服务KMS&#xff08;Key Management Service&#xff09;是您的一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台&#xff0c;提供简单、可靠、…