C#异步详解

news2024/11/16 19:36:59

异步编程是指在程序执行过程中,不需要等待某个操作完成,就可以继续执行后续的代码。比如我们开发了一个web页面中有一个上传文件功能,我们上传文件时使用异步操作,就不用等待文件的上传时间,可以先在网页上进行其他操作。但是如果我们的需求是等待上传文件完成之后才能进行下一步操作,比如我在boss上上传简历,然后根据附件简历生成在线简历,然后我在对在线简历进行优化,这时候就需要加一个await等待这个异步完成。

下面使用代码来举一个例子

创建一个 100000000个a 的超长字符串,然后把这个字符串写进d盘的文本里面

public static async Task Main(string[] args)
{
    string str = new string('a', 100000000);
    await File.WriteAllTextAsync("d:/1.txt", str);//加了await的异步写入
    File.WriteAllTextAsync("d:/2.txt", str);//异步写入
    File.WriteAllText("d:/3.txt", str);
}

打个断点 ,一步一步来执行

执行完第一行写入到d盘的1.txt时 ,d盘已经有了一个记事本,有很多的a,因为这句代码加了await,这里会等它执行完再到下一步。

 接着往下走,执行到最后一行代码时,虽然D盘也有2.txt了,但是由于我没有加await,此时并没有等第三句代码执行完。所以这个断点往下走时我们会发现并不会像上面一样等很久,因为异步方法会立刻返回到调用者,因此也叫(非阻塞方法)

可以看到记事本中有很多的a,但是很显然没有 100000000个,很显然是写到一半被我的断点停住了。

 

 把断点继续,此时最后两句代码一起在执行,分别往2.txt和3.txt写入。

在上面的方法中加入打印线程,看一下执行过程线程的变化

string str = new string('a', 100000000);

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

await File.WriteAllTextAsync("d:/1.txt", str);//加了await的异步写入
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

File.WriteAllTextAsync("d:/2.txt", str);//异步写入
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

File.WriteAllText("d:/3.txt", str);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

 打印结果显示,加了await的异步方法执行完后线程发生了变化 ,因为原有线程遇见await会被解放,用于执行异步任务的线程会在任务完成后返回到await处接替原有线程继续执行任务

再举一个例子,我们自己创建一个异步方法

public static  async Task MethodAsync()
{  
    await Task.Run(() =>
    {  
        for (int i = 0; i < 1000; i++)
        {  
            Console.WriteLine(" MethodAsync   "+i);  
        }  
            Console.WriteLine("异步线程=====>"+Thread.CurrentThread.ManagedThreadId);
    });  
}  

再创建一个普通方法

    public static void Method()
    {  
        for (int i = 0; i < 1000; i++)
        {  
            Console.WriteLine(" Method    " +i);  
        }  
            Console.WriteLine("普通方法线程=====>"+Thread.CurrentThread.ManagedThreadId);
    }  

在main方法中使用await调用异步方法

    public static async Task Main(string[] args)
    {
        Console.WriteLine("线程main =====>"+Thread.CurrentThread.ManagedThreadId);
        await MethodAsync();
        Console.WriteLine("线程main=====>"+Thread.CurrentThread.ManagedThreadId);
        Method();
        Console.WriteLine("线程main=====>"+Thread.CurrentThread.ManagedThreadId);
    }

 把方法停在普通方法前

控制台输出👇

 因为加了await,所以等待异步方法for循环完成,从控制台输出结果看出,main方法一开始的线程是1,在执行异步方法时线程是3,执行完异步方法后回到main方法,打印线程还是3,因此上面提到的

原有线程遇见await会被解放,用于执行异步任务的线程会在任务完成后返回到await处接替原有线程继续执行任务

这句话成立。

 那我们再试试不加await的

 还是一样停在刚刚的断点处,可是此时的两次主线程打印都是1,异步方法还没开始打印

 继续往下走,在控制台中发现,异步方法中新开了一个线程3,和普通方法交叉打印,最后打印主方法的线程也是原来的线程。

 

 

 

 说完await,我们再来看看async

async来修饰一个方法,表明这个方法是异步的,声明的方法的返回类型必须为:voidTaskTask<TResult>。方法内部必须含有await修饰的方法,如果方法内部没有await关键字修饰的表达式,哪怕函数被async修饰也只能算作同步方法,执行的时候也是同步执行的。

因此await和async是形影不离的,如下创建两个方法

    Task<string> ReadAsync()
    {
        return File.ReadAllTextAsync(@"D:\1.txt");
    }

    async Task<string> ReadAsync2()
    {
        return await File.ReadAllTextAsync(@"D:\1.txt");
    }

 

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

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

相关文章

Linux 命令(9)—— top

文章目录 1、命令简介2、使用方法3、命令行参数4、显示摘要5、进程列表字段6、交互命令a、全局命令b、摘要区域命令c、任务区域命令d、颜色映射e、可选显示窗口 7、配置文件a、系统配置文件b、个人配置文件 1、命令简介 top提供运行系统的动态实时视图。它可以显示系统摘要信息…

RK3399平台开发系列讲解(Pinctrl子系统)pinctrl的使用

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、配置 pinctrl二、调用 pinctrl2.1、Iomux 配置2.2、驱动强度配置2.3、上下拉配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍pinctrl设备树的使用方法。 一、配置 pinctr…

牛客网专项练习——C语言错题集(6)

文章目录 数组地址的移位C 源程序和函数的关系二维数组值的表示方式&#xff08;n & (n-1)) 0容易出错的 位运算fseek 可以实现的操作 数组地址的移位 个人理解&#xff1a; 这题的 A C 选项的差别应该在优先级上&#xff08;下文有 C 语言运算符优先级表&#xff09;&am…

移动端测试-Adb工具

移动端测试_Adb工具 Adb的基本使用简要介绍通用操作步骤一、连接设备二、断开设备三、安装四、卸载五、抓取日志六、文件传输七、截屏八、清除apk缓存九、查看终端各apk占用内存 Adb的基本使用 简要介绍 adb其实就是移动端的调试工具&#xff0c; 全称为Android Debug Bridge…

chatgpt赋能python:Python设置画笔粗细:从入门到精通

Python设置画笔粗细&#xff1a;从入门到精通 在Python中&#xff0c;画图是非常常见的操作。设置画笔的粗细是其中的一个重要部分。本文将从最基础的设置粗细开始讲起&#xff0c;逐步深入&#xff0c;带您了解Python设置画笔粗细的各种方法。 一、使用pensize()函数 pensi…

【备战秋招】每日一题:5月13日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第三题-火车调度 在线评测链接:P1288 题目描述 塔子哥是一位火车车厢调度员。 这一天&#xff0c;一列带有 n 个编号车厢的列车进站了&#xff0c;编号为 1\rightarrow …

【瑞萨RA_FSP】GPT—— 通用PWM定时器

文章目录 一、PWM简介二、GPT简介三、GPT的框图分析1. 计数器2. 周期设置和周期设置缓冲寄存器3. 时钟输入4. 控制寄存器5. 比较器和比较/输入捕获寄存器6. 中断请求信号7. IO输入输出引脚8. ELC事件输入9. 输出相位切换 一、PWM简介 PWM 的全称是脉冲宽度调制&#xff08;Pul…

chatgpt赋能python:如何安装PyQt5

如何安装PyQt5 Python是现在最受欢迎的编程语言之一。Python与它的第三方库使得开发者能够在不同的领域中编写高质量的代码。因此&#xff0c;Python已经成为了许多开发者的首选之一&#xff0c;而PyQt5则是Python中使用最多的图形界面开发工具之一。在这篇文章中&#xff0c;…

chatgpt赋能python:Python环境安装必知必会

Python环境安装必知必会 Python作为一种高效、易用、广受欢迎的程序语言&#xff0c;在数据分析、人工智能、Web开发等领域都得到了广泛应用。如果您也想学习Python&#xff0c;或者需要开发Python程序&#xff0c;那么必须首先安装Python环境。本文将为您介绍Python环境安装的…

分享!!前端也需要了解的一些技术!!

目录 1、临时路径共享使用 2、关闭指定端口号的进程 1、临时路径共享使用 场景&#xff1a;自己开发中的pc、移动端、app等&#xff0c;由于还在开发中&#xff0c;没有上线&#xff0c;此时有的人需要暂时使用它么&#xff0c;那么就可以创建一个临时路径&#xff0c;共享给…

Anaconda jupyter lab安装及初使用

之前写了一篇&#xff1a; Anaconda、Jupyter的安装部署及使用问题总结 最近又用python比较多&#xff0c;升级了一下本机的anaconda版本&#xff0c;并使用jupyter lab来编写python脚本&#xff0c;本文记录一下升级、使用过程。 安装anaconda 下载安装包 Anaconda3-2023.03…

【Biomechanics】1 Biomechanics as an Interdiscipline

无回到目录第2章 文章目录 1.0 Introduction1.1 Measurement, Description, Analysis, and Assessment1.1.1 Measurement, Description, and Monitoring1.1.2 Analysis1.1.3 Assessment and Interpretation 1.2 Biomechanics and its Relationship with Physiology and Anatomy…

基于flask的web应用开发——搭建一个云盘

目录 0. 前言1. 实现开放下载链接2. 稍加改装3. 效果演示4. 云服务器项目部署 0. 前言 本节利用 flask 开放下载链接 操作系统&#xff1a;Windows10 家庭版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版本&#xff1a;Python3.8 第三方库&#xff1a;fla…

Opencv的getRotationMatrix2D函数底层解析

源码 cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale ) {angle * CV_PI/180;double alpha cos(angle)*scale;double beta sin(angle)*scale;Mat M(2, 3, CV_64F);double* m M.ptr<double>();m[0] alpha;m[1] beta;m[2] (1-alpha)*…

chatgpt赋能python:Python怎么装pip库

Python怎么装pip库 Python是一种高级编程语言&#xff0c;由于其简单易学和功能强大&#xff0c;成为众多开发者的选择。但是在开发过程中&#xff0c;需要使用到各种库。pip是Python的软件包管理器&#xff0c;通过pip工具&#xff0c;我们可以轻松地安装和管理Python库。 什…

iOS 单元测试之常用框架 OCMock 详解 | 京东云技术团队

一、单元测试 1.1 单元测试的必要性 测试驱动开发并不是一个很新鲜的概念了。在日常开发中&#xff0c;很多时候需要测试&#xff0c;但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候&#xff0c;往往是用模拟器一次一次的从头开始启动 app&a…

chatgpt赋能python:Python怎么让输出不换行

Python怎么让输出不换行 Python是一款具有高度灵活性和扩展性的语言&#xff0c;代码简洁易懂&#xff0c;易上手。在Python编程中&#xff0c;输出的相关操作也是非常常见的。在某些情况下&#xff0c;我们需要让输出内容在同一行显示&#xff0c;这时我们需要使用Python提供…

【Docker】技术架构演进

基本概念 应用&#xff08;Application&#xff09; / 系统&#xff08;System&#xff09; ​ 为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比&#xff1a;为了完成一项任务&#xff0c;而搭建的由一个人或者一群相互配的人组成的团队。 模块&#xff0…

C++【STL】之list的使用

文章目录&#xff1a; list介绍list使用1. 默认成员函数1.1 构造函数1.2 拷贝构造1.3 赋值重载1.4 析构函数 2. 迭代器3. 容量操作4. 数据访问5. 数据修改5.1 插入删除5.2 交换调整清理 6. 其他操作6.1 链表拼接6.2 链表移除6.3 排序6.4 链表逆置 list介绍 list是可以在常数范围…

STM32软件定时器

目录 什么是定时器&#xff1f; 软件定时器优缺点 软件定时器原理 软件定时器相关配置 单次定时器和周期定时器 软件定时器相关 API 函数 1. 创建软件定时器 2. 开启软件定时器 3. 停止软件定时器 4. 复位软件定时器 5. 更改软件定时器定时时间 实操 cubeMX配置 …