C#多线程编程03-异步编程

news/2026/1/17 21:11:27/文章来源:https://www.cnblogs.com/nonAny/p/19495828

1、多线程编程侧重于分而治之的方面,异步编程同样是多线程编程但是侧重于将长时间运行的任务卸载,其强调了有任务在主线程之外运行的情况

 

2、多线程编程通常用于CPU密集型操作,

  异步编程特别适用于I/O密集型操作:大多数情况下,它来自远程服务器、远程数据库。

 

3、创建任务的方法

//方法1
Task task = new Task(Work);
task.Start();//方法2
var task1 = Task.Run(Work);
void Work()
{Console.WriteLine("Hello World");
}

 

4、Task与Thread的区别:

  Task是一个Promise,它不一定涉及线程,它只是我们承诺在未来某个时间完成任务。

  Thread是在CPU中运行某些内容的基本编程单元。

  Task大多数时候实际上使用线程来执行任务,但它不一定必须这样做。

  任务默认使用线程池。

  使用Task时可以返回值,因此返回值变得更加容易,而使用线程时,你必须使用共享资源,这会导致不同的问题如同步问题、竞态条件。

  Task简单的延续,更好的异常处理,有await和async代码,使其编写异步代码如同步代码,

  Task便于同步上下文,有利于解决线程亲和性

 

5、Task返回值Result

  该属性会被阻塞当前线程,直至任务完成

Task<int> task = Task.Run(Work);
Console.WriteLine($"The result is {task.Result}");
Console.ReadLine();int Work()
{Console.WriteLine("Hello World");int result = 100;return result;
}

 

6、wait和WaitAll方法

  问题:Task是对在未来某个时间完成任务的承诺,我们需要知道它的完成时刻方便执行一些其他任务。

  实现方法:wait、waitAll

  会阻塞你直到任务完成,并使程序变成同步而不是异步。

  

Wait方法:等待对应的任务,阻塞调用线程(该案例为主线程),直至任务结束

int sum = 0;var task = Task.Run(() =>
{for (int i = 0; i <= 100; i++){Task.Delay(100);sum += i;}
});
task.Wait();Console.WriteLine($"The result is: {sum}");
Console.ReadLine();

 

WaitAll:当有多个任务需要等待时,可使用该方法

Task.WaitAll(task1,task2);
Task.WaitAll(taskArr);

 

7、任务的延续

  当一个任务需要在前一个任务完成后才开始时需要,这时我们需要使用ContinueWith()

  等待第一个任务完成,然后你开始执行另一个任务,但第一个任务或第二个任务都不应阻塞主线程。

using System.Text.Json;using var client = new HttpClient();
//第一个任务
var task = client.GetStringAsync("https://pokeapi.co/api/v2/pokemon/");//ContinueWith返回一个与第一个不同的新任务
//t代表前一个任务
task.ContinueWith(t =>
{var res=t.Result;//仅阻塞该新任务,不会阻塞主线程var doc = JsonDocument.Parse(res);JsonElement root = doc.RootElement;JsonElement result = root.GetProperty("results");JsonElement first = result[0];Console.WriteLine(first.GetProperty("name"));Console.WriteLine(first.GetProperty("url"));
});Console.WriteLine("This is the end of the program.");
Console.ReadLine();

 

WhenAll()当所有任务完成时,等待所有任务完成,创建一个新任务。

WhenAll()接受一个任务集合,并返回一个任务,该任务将在所有给定的任务完成时完成。

WhenAll()不会阻塞当前线程,而是返回一个任务,你可以等待这个任务

 WhenAll()用于等待多个任务完成,然后继续执行

可以在 WhenAll 返回的任务上使用 ContinueWith,以便在多个任务都完成时执行一个操作

int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int SumSegment(int start, int end)
{int segment = 0;for (int i = start; i < end; i++){segment += arr[i];}return segment;
}int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
var startTime = DateTime.Now;int numberofThread = 4;
int segmentLength = arr.Length / numberofThread;var threads = new Task<int>[numberofThread];
threads[0] = Task.Run(() => {return SumSegment(0, segmentLength); });
threads[1] = Task.Run(() => { return  SumSegment(segmentLength, 2 * segmentLength); });
threads[2] = Task.Run(() => { return SumSegment(2 * segmentLength, 3 * segmentLength); });
threads[3] = Task.Run(() => { return SumSegment(3 * segmentLength, arr.Length); });
Console.WriteLine($" The sum is {threads.Sum(t=>t.Result)}");//创建一个新任务时,可以通过ContinueWith继续
Task.WhenAll(threads).ContinueWith(t =>
{Console.WriteLine($"The summary is {t.Result.Sum()}");
});//WhenAny:当任何任务完成时,不必等待var endTime = DateTime.Now;
Console.WriteLine("END");
var timespan = endTime - startTime;
Console.WriteLine($"the time it takes:{timespan.TotalMilliseconds}");Console.ReadLine();

 

8、延续链与Unwarp

using System.Text.Json;using var client = new HttpClient();
//第一个任务
var taskListJson = client.GetStringAsync("https://pokeapi.co/api/v2/pokemon/");var taskGetFirstUrl = taskListJson.ContinueWith(t =>
{var res = t.Result;var doc = JsonDocument.Parse(res);JsonElement root = doc.RootElement;JsonElement result = root.GetProperty("results");JsonElement first = result[0];return first.GetProperty("url").ToString();
});var taskGetDetailJson = taskGetFirstUrl.ContinueWith(t =>
{var result = t.Result;return client.GetStringAsync(result);
}).Unwrap();taskGetDetailJson.ContinueWith(t =>
{var res = t.Result;var doc = JsonDocument.Parse(res);JsonElement root = doc.RootElement;Console.WriteLine($"name: {root.GetProperty("name")}");Console.WriteLine($"height: {root.GetProperty("height")}");}
);
Console.WriteLine("This is the end of the program.");
Console.ReadLine();

 

9、Task当中的异常

  Task当中的异常是被隐藏的

  无法使用try...catch机制进行处理

  异常实际存储在任务本身当中

  多个异常可以被存储,故需要迭代查看

  使用wait或者result属性将存储的异常抛出

 

10、任务的同步技术与线程的同步技术一致

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

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

相关文章

【多输入多输出(MIMO)干扰网络的能效优化】基于采用迭代半定规划-加权最小均方误差(SDP-WMMSE)算法与逐次凸逼近(SCA)算法求解MIMO干扰无线网络的能效优化问题研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

Unity 鼠标控制 API 技术文档

成员 类型 说明Cursor.visible bool 控制鼠标指针是否可见。true 表示显示,false 表示隐藏。Cursor.lockState CursorLockMode 控制鼠标指针的锁定状态。Cursor.SetCursor(Texture2D texture, Vector2 hotspot, Curso…

【多无人机】面向并行数据采集的多无人机粗粒度闭环轨迹设计无人机检测研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

【多无人机】面向城市空中交通的多无人机路径规划研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

导师推荐8个AI论文写作软件,助你轻松搞定本科论文!

导师推荐8个AI论文写作软件&#xff0c;助你轻松搞定本科论文&#xff01; AI 工具让论文写作不再难 在当今信息爆炸的时代&#xff0c;本科生们面对的不仅是繁重的课程压力&#xff0c;还有论文写作这一道“硬关”。无论是开题报告、文献综述还是最终的毕业论文&#xff0c;都…

揭秘提示工程架构师在智能作曲的实用应用技巧

提示工程架构师的智能作曲手册&#xff1a;用文字“编写”音乐的10个实用技巧 关键词 提示工程、智能作曲、大语言模型&#xff08;LLM&#xff09;、音乐生成、Prompt设计、上下文锚点、风格迁移 摘要 凌晨三点&#xff0c;短视频导演小王盯着电脑里的素材——老人摸着旧书店的…

用户态网络栈:DPDK 入门实战,绕过 Linux 内核实现“零拷贝”收发包

标签&#xff1a; #DPDK #NetworkProgramming #C #LinuxKernel #HighPerformance #ZeroCopy&#x1f422; 前言&#xff1a;Linux 内核为何成了瓶颈&#xff1f; 在传统的网络路径中&#xff0c;数据包的旅程是漫长而曲折的&#xff1a; 硬件中断&#xff1a;网卡收到包 -> …

Android 脱壳实战:Frida 脚本 Hook dlopen,在内存中 dump 出被加固的 DEX 文件

标签&#xff1a; #AndroidReverse #Frida #脱壳 #MobileSecurity #Hook #DEX ⚠️ 免责声明&#xff1a;本文仅供技术研究与安全防御教学使用。请勿将相关技术用于非法破解、制作外挂或破坏商业软件&#xff0c;否则后果自负。&#x1f4c9; 前言&#xff1a;脱壳的核心原理—…

导师严选2026 TOP8一键生成论文工具:专科生毕业论文必备测评

导师严选2026 TOP8一键生成论文工具&#xff1a;专科生毕业论文必备测评 2026年专科生论文写作工具测评&#xff1a;如何选择真正实用的助手 随着高校对论文质量要求的不断提升&#xff0c;专科生在毕业论文写作过程中面临的挑战也日益增加。从选题构思到文献检索&#xff0c;从…

【无人机通信】无人机 - 电力线宽带同步算法,该算法借助农场现有的电网基础设施,实现经济高效、可扩展的数据采集附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

基于Java的家政行业智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 家政行业智慧管理系统的设计与实现结合了丰富的功能模块和先进的技术框架&#xff0c;旨在为家政企业提供全面的信息化管理解决方案。系统主要包含21个子模块&#xff1a;家政人员、客户、服务项目、薪资记录等&#xff0c;并通过SpringM…

Chet.QuartzNet.UI 分析页重构,数据可视化体验升级!

&#x1f525; Chet.QuartzNet.UI 分析页重构&#xff0c;数据可视化体验升级&#xff01; &#x1f3af; 为什么要重构分析页&#xff1f; 之前的分析页虽然能展示数据&#xff0c;但界面不够直观&#xff0c;数据展示形式单一&#xff0c;用户体验有待提升。为了让开发者能…

Java广播 —如何利用广播做服务发现

通过广播可以在局域网内广播信息&#xff0c;广播接收端通过监听广播信息&#xff0c;可以自动发现局域网内所有的设备/服务信息。 1. 发送广播 在 Java 中通过将 DatagramSocket 设置 setBroadcast(true) 来发送广播。 DatagramSocket socket new DatagramSocket(); socket…

WPF 使用 HLSL #x2B; Clip 实现高亮歌词光照效果

最近在搓一个Lyricify Lite类似物&#xff0c;原本使用渐变画刷实现歌词高亮&#xff0c;但是发现视觉效果与Apple Music相去甚远&#xff1a;单纯使用白色渐变画刷缺乏“高亮”的光照感觉&#xff0c;而Apple Music的歌词高亮则更像是有光线投射在歌词上&#xff0c;形成一种柔…

java controller的DTO如果有内部类,应该注意什么

在Java Controller中使用带有内部类的DTO时&#xff0c;需要注意以下关键点&#xff1a;1. 内部类必须是静态的&#xff08;static&#xff09;// ✅ 正确做法 public class UserDTO {private String name;private Address address;public static class Address { // 必须是st…

Nano Banana AI 绘画创作前端代码(使用claude code编写)

在线 https://chat.xutongbao.top/nextjs/light/nano use clientimport Header from /components/header import {ArrowLeft,Send,RefreshCw,Sparkles,Upload,X,Download,Copy,Check,ImagePlus,Maximize2, } from lucide-react import { useRouter } from next/navigation imp…

WPF 使用 HLSL + Clip 实现高亮歌词光照效果

最近在搓一个Lyricify Lite类似物,原本使用渐变画刷实现歌词高亮,但是发现视觉效果与Apple Music相去甚远:单纯使用白色渐变画刷缺乏“高亮”的光照感觉,而Apple Music的歌词高亮则更像是有光线投射在歌词上,形成…

Redis 协议兼容:编写一个支持 RESP 协议的 KV Server

标签&#xff1a; #Redis #RESP #Go语言 #网络编程 #中间件开发 #Socket&#x1f4dc; 一、 破译 RESP&#xff1a;Redis 的通信语言 RESP 是一个基于文本的协议&#xff0c;极其简单且高效。它主要由 前缀符号 和 CRLF (\r\n) 组成。 客户端发送给服务端的&#xff0c;永远是一…

排它锁与共享锁详解 - 详解

排它锁与共享锁详解 - 详解2026-01-17 20:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …