C#异步编程学习笔记之-async和await(续)
书接上文,本篇主要记录的内容要点:
1、针对async和await在实际应用中的使用方式;
2、异步方法返回值(有返回值和无返回值)的两种情况;
示例一(无返回值):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using System.Text.RegularExpressions; using System.Web; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication2 { class Program { static void Main( string [] args) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法开始执行" ); TestAsync(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法执行完毕!" ); Console.ReadKey(); } static async void TestAsync() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法开始" ); await MyMethod(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法结束" ); } //模拟耗时操作 //重要说明:如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行, //即使有async修饰符,也不例外。 static async Task MyMethod() { for ( int i = 0; i < 5; i++) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "异步执行" + i.ToString() + ".." ); await Task.Delay(1000); //模拟耗时操作 //Thread.Sleep(1000); //不能用 } } } } |
运行结果:
重要说明:如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行,即使有async修饰符,也不例外,结果如下:
示例二(有返回值):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using System.Text.RegularExpressions; using System.Web; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication3 { class Program { static void Main( string [] args) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法开始执行" ); Task< string > result = TestAsync(); //如果此时用result.Result 获取异步结果,那么主线程将阻塞,等待异步线程返回结果后才继续执行 //Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--子任务返回结果:" + result.Result); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "--主方法执行完毕!" ); Console.ReadKey(); } static async Task< string > TestAsync() { string strRet = string .Empty; Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法开始" ); //strRet = await Task.Run(() => Test()); //写法一 strRet = await Test(); //写法二 Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "TestAsync方法结束,结果:" + strRet); return strRet; } //模拟耗时操作 //重要说明:如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行, //即使有async修饰符,也不例外。 static async Task< string > Test() { await Task.Delay(5000); //Thread.Sleep(1000); //不能用 Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "耗时任务执行。。。" ); return "ok" ; } } } |
运行结果:
说明:
异步方法的返回值要在异步方法里获取,否则异步失效,如:
分类:
.NET
标签:
async和await
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端