C#异步详解

news/2025/2/23 5:46:02/

异步编程是指在程序执行过程中,不需要等待某个操作完成,就可以继续执行后续的代码。比如我们开发了一个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.ppmy.cn/news/428714.html

相关文章

DecimalFormat基本用法

1.保留两位小数(截断&#xff09; 下面展示一些 内联代码片。 double num 11.256;DecimalFormat df new DecimalFormat("#.##");//指定RoundingModedf.setRoundingMode(RoundingMode.DOWN);String str df.format(num);double formatNum Double.parseDouble(str)…

宽带拨号连接显示被远程计算机终止

搜索框打开设备管理器 找到网络适配器 找到IP协议 卸载设备之后重启电脑

C++ STL中stack栈(简单讲解+例题运用)

运用stack函数首先需要头文件#include<stack>&#xff0c;栈是先进后出 stack的常用函数&#xff1a; push&#xff08;&#xff09;——向栈顶压入元素pop &#xff08;&#xff09;——弹出栈顶元素top &#xff08;&#xff09;——访问栈顶元素empty&#xff08…

账号被计算机远程终止,宽带远程连接被终止怎么办

宽带远程连接被终止?拨号上网的时候突然出现错误629,连接被远程计算机终止,这到底是怎么回事?面对连接宽带错误,下面让小编教你解决629被远程计算机终止的问题. 今天小编教你遇到宽带远程连接被终止&#xff0c;如何快速解决吧。 1.操作系统中存在错误&#xff0c;并提示您正…

台式电脑连接宽带远程计算机没反应怎么办,怎么处理宽带连接提示连接被远程计算机终止?...

现在有很多人使用宽带拨号上网&#xff0c;有个小伙伴的宽带有一天就出现了宽带被远程计算机终止&#xff0c;这是怎么一回事呢&#xff1f;这样一来他的宽带就无法上网了&#xff0c;电脑没了网基本什么也干不了。请大家和小编一起来看看这个问题有什么好办法可以解决呢&#…

连接远程电脑的时候提示:此计算机无法连接到远程计算机

本人遇到问题一&#xff0c;采用方法6&#xff0c;成功解决问题。 特此转官方解决方案以推广&#xff0c;文末附链接。 一、无法从客户端连接到远端 错误情况大致为&#xff1a;“此计算机无法连接到远程计算机。请尝试重新连接&#xff0c;如果问题仍然存在&#xff0c;请联系…

Windows远程连接桌面报错“由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。请跟服务器管理员联系。”

1、win键R打开运行器&#xff0c;使用mstsc -admin命令强制远程 2、输入远程服务器ip、用户名和密码&#xff0c;忽略证书问题的提示框&#xff0c;即可连接进入远程桌面 3、在远程桌面中&#xff0c;打开远程服务器的运行框&#xff0c;使用regedit命令打开注册表 进入计算机…

Windows远程桌面连接报错【无法连接到远程计算机】

问题如下&#xff1a; 解决方法&#xff1a; 1. 查看远程设置&#xff1a; 右键我的电脑&#xff0c;查看电脑属性&#xff0c;打开“远程”设置。 勾选上下图红框两个选项 2.查看防火墙&#xff1a; 查看防火墙是否开启&#xff0c;如果开启&#xff0c;点击“允许应用通过…