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

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用

2、快速创建一个线程

3、多次运行程序,可以得到输出结果

这就是多线程的特点 - 当多个线程并行执行时,它们的具体执行顺序是不确定的,除非我们使用同步机制(如 lock、信号量等)来控制执行顺序。

4、新建一个类TestThread,以及一个静态的测试方法,用来做测试使用

5、在Program中,把输出改成调用TestThread类中的测试方法再次执行测试一下

6、执行以后的输出结果,如下图所示

7、Thread.Sleep(毫秒):线程的等待(睡眠)

执行结果:

8、Thread.Join() 代表线程执行完毕以后,才可以继续执行后续的代码

如下图所示,在thread线程内部执行完成以后,很快就接着执行最后的打印输出方法了

9、Thread.Join(毫秒) 代表等待当前线程执行多长时间,如果超出设定的毫秒数,就会直接执行后续的代码

运行程序,查看执行结果


1、新增Test2方法,用来测试线程池ThreadPool使用

2、WaitCallback也是一个委托,传入需要在线程池内执行的方法名称。以下代码内,“线程池”字符串为要执行方法对应的参数

ThreadPool:
这是.NET中的线程池类
它维护着一组可重用的线程
比直接创建新线程更有效率QueueUserWorkItem:
这个方法用于将工作项添加到线程池队列中
线程池会自动分配空闲线程来执行这些工作项WaitCallback:
这是一个委托类型
定义了线程池中的线程要执行的方法
可以接收一个 object 类型的参数TestThread.Test2:
这是你定义的要在线程池中执行的方法
它有这样的签名:public static void Test2(object state)"线程池":
这是传递给 Test2 方法的参数

3、除了直接传入回调方法,也可以直接在线程池开启的方法内,直接写代码块来当做多线程执行的部分

4、线程池内,可以通过设置Manual信号量,来识别线程池内的线程什么时候执行完成。


**1、创建一个TestAsyncAction类,添加一个模拟的异步方法TestAction

2、使用Task快读创建一个线程。最简单的方法:Task.Run(()=>{ 代码块 })

3、两个线程并行执行,查询执行结果

4、如果想等待新开线程执行完再继续执行后续的代码,可以使用如下方式:使用 await 等待整个操作完成

await Task.Run(async () =>
{await TestAsyncAction.TestAction();
});代码会等待异步操作完成才继续执行

执行结果:

5、也可以使用Task.Factory创建一个任务工厂来实现

6、查看执行结果


1、【异步结合多线程】如果有多个任务在执行期间,在任意一个线程执行完毕以后进行执行某种操作,可以使用 ContinueWhenAny来进行

// See https://aka.ms/new-console-template for more information
using MultiThreading;Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}>>>>Hello, World!");var tasks = new Task[3];TaskFactory factory = new();/** .Unwrap() 主要是用来处理嵌套任务问题。* 使用 StartNew 执行 async lambda 时,会得到一个 Task<Task> (双层嵌套的Task)*          // 不使用 Unwrapvar task1 = factory.StartNew(async () => {await Task.Delay(1000);return "Hello";});// task1 的类型是 Task<Task<string>>// 需要两次 awaitstring result1 = await (await task1);---------------------------------------------------// 使用 Unwrapvar task2 = factory.StartNew(async () => {await Task.Delay(1000);return "Hello";}).Unwrap();// task2 的类型是 Task<string>// 只需要一次 awaitstring result2 = await task2;*/
tasks[0] = factory.StartNew(async () =>
{await TestAsyncAction.AsyncAction1();
}).Unwrap();tasks[1] = factory.StartNew(async () =>
{await TestAsyncAction.AsyncAction2();
}).Unwrap();tasks[2] = factory.StartNew(async () =>
{await TestAsyncAction.AsyncAction3();
}).Unwrap();_ = factory.ContinueWhenAny(tasks, x =>
{Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}>>>>正常代码");
});Console.ReadLine();//阻止程序退出PS:如果后续代码依赖于续联任务的完成,使用 await如果不关心续联任务何时完成,使用 _=

查看执行结果:

2、【异步结合多线程】如果要等任务全部执行完毕以后才执行某个代码块,可以使用ContinueWhenAll

查看执行结果:

PS:
// 可以使用 Task.WhenAny 替代 ContinueWhenAny
_ = Task.WhenAny(tasks).ContinueWith(t => {Console.WriteLine(">>>>正常代码");
});

3、异步方法中 使用 WhenAll 和 WhenAny(这个仅模拟纯IO操作,不涉及多线程)

  当遇到 await 时,当前方法会返回到调用者主线程可以继续处理其他工作(比如UI响应、处理其他事件等)这些任务会被放到线程池中执行当前方法内 await 后面的代码会被打包成续接(continuation)这个续接会等待所有任务完成后才执行但这个等待是异步的,不会占用主线程资源

  • .WhenAll()

查看执行结果:

  • .WhenAny()

查看执行结果:

文章转载自:sq1201

原文链接:.NET8.0多线程编码结合异步编码示例 - sq1201 - 博客园

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序&#xff0c;可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时&#xff0c;它们的具体执行顺序是不确定的&#xff0c;除非我们使用同步机制&#xff08;如 lock、信号量等&am…...

SpringBoot项目中解决CORS跨域资源共享问题

在Spring Boot项目中解决CORS&#xff08;跨域资源共享&#xff09;问题&#xff0c;可以通过以下几种方法&#xff1a; 1. 使用CrossOrigin注解 这是最简单的方法&#xff0c;适用于单个控制器或控制器方法级别的跨域配置。你可以在控制器类或具体的方法上使用CrossOrigin注…...

Android string.xml中特殊字符转义

项目中要在string.xml 中显示特殊符号 空格&#xff1a; &#xff08;普通的英文半角空格但不换行&#xff09; 窄空格&#xff1a;  &#xff08;中文全角空格 &#xff08;一个中文宽度&#xff09;&#xff09; &#xff08;半个中文宽度&#xff0c;但两个空格比一个中文…...

解析传统Workflow、AI Workflow与AI Agent概念,并通过Coze案例探讨利用AI工作流构建应用的实践流程

传统工作流 工作流入门这篇就够了 BPMN.JS中文教程 BPMN 工作流引擎解析 定义&#xff1a;工作流是在计算机支持下业务流程的自动或半自动化&#xff0c;其通过对流程进行描述以及按一定规则执行以完成相应工作。 应用&#xff1a;随着计算机技术的发展以及工业生产、办公自动…...

光谱相机的光谱分辨率可以达到多少?

多光谱相机 多光谱相机的光谱分辨率相对较低&#xff0c;波段数一般在 10 到 20 个左右&#xff0c;光谱分辨率通常在几十纳米到几百纳米之间&#xff0c;如常见的多光谱相机光谱分辨率为 100nm 左右。 高光谱相机 一般的高光谱相机光谱分辨率可达 2.5nm 到 10nm 左右&#x…...

android Recyclerview viewholder统一封装

Recyclerview holder 统一封装 ViewHolder类 import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.CountDownTimer import…...

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)

本文介绍在Windows电脑中&#xff0c;下载、部署NVM&#xff08;node.js version management&#xff09;环境&#xff0c;并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法&#xff08;https://blog.csdn.net/zhebushibiaoshi…...

51单片机入门基础

目录 一、基础知识储备 &#xff08;一&#xff09;了解51单片机的基本概念 &#xff08;二&#xff09;掌握数字电路基础 &#xff08;三&#xff09;学习C语言编程基础 二、开发环境搭建 &#xff08;一&#xff09;硬件准备 &#xff08;二&#xff09;软件准备 三、…...

老centos7 升级docker.io为docker-ce 脚本

旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh #!/bin/bashset -e# 创建临时目录 TEMP_DIR"./tmp" mkdir -p "…...

数仓建模(三)建模三步走:需求分析、模型设计与数据加载

本文包含&#xff1a; 数据仓库的背景与重要性数据仓库建模的核心目标本文结构概览&#xff1a;需求分析、模型设计与数据加载 目录 第一部分&#xff1a;需求分析 1.1 需求分析的定义与目标 1.2 需求分析的步骤 1.2.1 业务需求收集 1.2.2 技术需求分析 1.2.3 成果输出…...

PHP xml 常用函数整理

————————-DOM 函数————————————– 1、DOMDocument->load() 作用&#xff1a;加载xml文件 用法&#xff1a;DOMDocument->load( string filename ) 参数&#xff1a;filename&#xff0c;xml文件&#xff1b; 返回&#xff1a;如果成功则返回 TRUE&a…...

数据结构(Java版)第八期:LinkedList与链表(三)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序&#xff0c;也就是如上图所示。…...

数据结构学习记录-数据结构概念

1 数据结构&#xff1a; 数据结构是计算机存储&#xff0c;管理数据的方式。 数据必须依据某种逻辑联系组织在一起存储在计算机内 数据结构研究的就是这种数据的存储结构和数据的逻辑结构。 1.1 数据的逻辑结构&#xff1a; 逻辑结构指的是数据本身之间的关系 集合&#x…...

【Linux】11.Linux基础开发工具使用(4)

文章目录 3. Linux调试器-gdb使用3.1 背景3.2 下载安装3.3 使用gdb查询3.4 开始使用 3. Linux调试器-gdb使用 3.1 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须…...

数据结构与算法之栈: LeetCode 1047. 删除字符串中的所有相邻重复项 (Ts版)

删除字符串中的所有相邻重复项 https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/ 描述 给出由小写字母组成的字符串 s&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们在 s 上反复执行重复项删除操作&#xff0c;直到无…...

C++ 在线编译软件介绍、杭电OJ、北大OJ、力扣OJ

在线编译软件的话&#xff0c;可见下&#xff1a; https://www.jyshare.com/compile/12/ 杭州电子科技大学开发的一个免费的写代码地址 &#xff0c;杭电OJ https://bestcoder.hdu.edu.cn/ 北大OJ http://poj.org/ 力扣OJ 力扣 (LeetCode) 全球极客挚爱的技术成长平台...

Java学习笔记(二十三)

1 CacheEvict CacheEvict是Spring框架中用于清空缓存的注解。以下是对CacheEvict注解的详细介绍&#xff1a; 1.1 作用 CacheEvict注解的主要作用是删除缓存中的数据。在方法执行后或执行前&#xff08;根据配置&#xff09;&#xff0c;它可以清空指定的缓存项或整个缓存区…...

《AI赋能鸿蒙Next,开启智能关卡设计新时代》

在游戏开发领域&#xff0c;关卡设计是至关重要的一环&#xff0c;它直接影响着玩家的游戏体验和沉浸感。而随着人工智能技术的飞速发展&#xff0c;结合鸿蒙Next系统的强大功能&#xff0c;为游戏的智能关卡设计带来了全新的思路和方法。 利用AI学习玩家行为模式 在鸿蒙Next…...

js:正则表达式

目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本字符组合模式 正则表达式是一…...

linux环境使用docker部署多个war项目

如果你的需求是在一个服务器上部署多个Tomcat项目&#xff0c;并且每个项目需要独立运行&#xff0c;可以通过以下方式实现&#xff1a; 1. 使用不同的端口 每个Tomcat项目可以使用不同的端口号&#xff08;如9090、9091、9092等&#xff09;&#xff0c;并通过Docker容器分别…...

Topit:macOS窗口置顶神器,让多任务处理效率翻倍

Topit&#xff1a;macOS窗口置顶神器&#xff0c;让多任务处理效率翻倍 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否经常在macOS上同时处理多个任务时…...

Stitches API完全指南:从基础配置到自定义扩展

Stitches API完全指南&#xff1a;从基础配置到自定义扩展 【免费下载链接】stitches HTML5 Sprite Sheet Generator 项目地址: https://gitcode.com/gh_mirrors/sti/stitches Stitches是一款强大的HTML5 Sprite Sheet Generator&#xff0c;它提供了直观的API接口&…...

AMLP:基于大语言模型的自动化机器学习势函数构建平台

1. 项目概述&#xff1a;当AI遇见原子模拟&#xff0c;AMLP如何重塑机器学习势函数构建在计算材料科学和化学物理领域&#xff0c;分子动力学模拟是我们窥探微观世界动态行为的“显微镜”。无论是研究新材料的相变过程&#xff0c;还是探索生物大分子的折叠机制&#xff0c;其核…...

番茄小说下载器终极指南:三步构建你的离线阅读自由王国

番茄小说下载器终极指南&#xff1a;三步构建你的离线阅读自由王国 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在地铁里读到精彩章节时突然断网&#xff1f;是否在…...

数组专项(一):数组排序、去重、查找

大家好,欢迎来到《算法面试60讲(2026最新版全真题带解析)》第19篇!上一篇我们彻底吃透了字符串专项的核心难点——BF暴力匹配与KMP高效匹配算法,搞定了字符串模块面试最难的算法考点。从本节课开始,我们正式进入算法面试第一高频模块:数组专项。 在算法面试中,数组是出…...

别再死记硬背Payload了!我用XSS-Game靶场,带你拆解18种过滤规则背后的绕过逻辑

从XSS-Game靶场实战中掌握18种过滤规则的逆向思维在网络安全领域&#xff0c;跨站脚本攻击&#xff08;XSS&#xff09;始终是Web应用面临的主要威胁之一。许多开发者虽然了解XSS的基本概念&#xff0c;但当面对各种复杂的过滤规则时&#xff0c;往往不知如何系统分析并构造有效…...

别再死记硬背了!用5个生活化比喻彻底搞懂Linux进程的fork、exec和wait

别再死记硬背了&#xff01;用5个生活化比喻彻底搞懂Linux进程的fork、exec和wait想象你正在厨房准备一顿大餐。菜谱上写着"切菜"、"炒菜"、"装盘"等步骤&#xff0c;但突然发现需要同时处理多道菜品——这时候&#xff0c;你会本能地让家人分工…...

配置OpenClaw Agent使用Taotoken作为后端模型提供商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 配置OpenClaw Agent使用Taotoken作为后端模型提供商 基础教程类&#xff0c;指导希望使用OpenClaw等Agent工具的开发者&#xff0c…...

独立站内容分层:一层给 SEO,一层给 GEO

你的内容在喂两个完全不同的"阅读者" 你的博客文章&#xff0c;从来都不只有一个读者。 传统认知里&#xff0c;独立站内容的读者只有两类&#xff1a;真人访客和搜索引擎爬虫。SEO 优化的一切工作&#xff0c;本质上都是在讨好后者&#xff0c;顺带服务前者。 但…...

Office RibbonX Editor:简单三步打造你的专属Office界面

Office RibbonX Editor&#xff1a;简单三步打造你的专属Office界面 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...