随便玩玩之C# 14 异步方法
随便玩玩之C# 14 异步方法
举个例子吧。做一碗牛肉面,需要烧水、切菜、切肉,正常人的做法是先烧水,然后切菜切肉炒菜,然后水开了下面条,然后拌一拌即可使用,总结一下就是你干着一件事,我去做另外的事情,你做好了给我说一下。而电脑的做法是烧水等水开,下面条,切菜、切肉,炒菜,然后拌一拌,总结一下就是你要一个做完才能做下一步。
async/await由三部分组成:调用方法、异步函数、await表达式。调用方法调用异步函数,异步函数包含await表达式。
1.异步语法
没有异步的普通做法,代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | using System; using System.Threading; namespace AsyncMethod { internal class Program { static void Main( string [] args) { Console.WriteLine( "这是第一行语句,正常输出" ); calc(); Console.WriteLine( "这行输出要等到calc()计算完成后才能显示,也是最后一行输出" ); Console.ReadKey(); } static void calc() { Console.WriteLine( "这里放置一个计算器,需要长时间计算" ); //这里没有防止计算代码,用线程睡眠代替。 Thread.Sleep(5000); Console.WriteLine( "这里的计算时间是5秒,程序会等待5秒" ); Console.WriteLine( "计算完成。" ); } } } |
运行结果:
显然,程序运行到calc()方法阶段,因为calc()方法的大量计算需要时间,所以程序就一直再等待运行结果。只能等待calc()结果出来了才能继续执行下面的代码。
使用异步方法可以让程序继续执行,calc()计算结果出了再显示结果。不耽误去做别的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | using System; using System.Threading; using System.Threading.Tasks; namespace AsyncMethod { internal class Program { static void Main( string [] args) { Console.WriteLine( "这是第一行语句,正常输出" ); calc(); Console.WriteLine( "这行输出要等到calc()计算完成后才能显示,也是最后一行输出" ); Console.ReadKey(); } static async void calc() { Console.WriteLine( "这里放置一个计算器,需要长时间计算" ); //这里没有防止计算代码,用线程睡眠代替。 await Task.Run(() => Thread.Sleep(5000)); Console.WriteLine( "这里的计算时间是5秒,程序会等待5秒" ); Console.WriteLine( "计算完成。" ); } } } |
运行结果。
观察运行结果,程序中能输出的就先输出了,需要等待的就等计算完成再出来。
总结一下就是一句话,你先去搞,搞好了给我说一下。
2.WPF中演示异步。
控制台上演示就是缺点啥,反正就是搞不懂。用带图形界面演示就方便多了。最明显的表现就是程序遇到大量数据计算式程序界面会卡住。这就需要用异步编程来解决。
向WPF设计器放置两个控件:一个button一个textbox一个label。将LABEL命名未label1
双击button,添加如下代码:
1 2 3 4 5 | private void Button_Click( object sender, RoutedEventArgs e) { Thread.Sleep(5000); } |
运行程序。
这是没有使用异步编程的程序,当点击数据计算按钮后,程序后停止5秒,程序界面卡住,无法拖动,textbox也无法点击。
修改代码为异步模式。
1 2 3 4 5 6 7 | private async void Button_Click( object sender, RoutedEventArgs e) { label1.Content = "程序开始计算,还没有计算完成" ; // Thread.Sleep(5000); await Task.Run(() => Thread.Sleep(5000)); label1.Content = "计算完成" ; } |
再次运行程序,点击数据计算按钮,程序界面未卡住,可以拖动,也可以再textbox中编辑文字。
异步与多线程并不是同一个概念,多线程编程是实现异步的一种手段 同步异步更强调的是消息反馈机制,即调用后是否需要等待返回结果。
参考资料。
https://zhuanlan.zhihu.com/p/350816301
https://www.zhihu.com/question/58922017
https://www.jb51.net/article/235964.htm
https://www.cnblogs.com/mushroom/p/4575417.html
https://www.cnblogs.com/kiba/p/9292904.html
https://www.cnblogs.com/springsnow/p/13140601.html
https://www.cnblogs.com/s0611163/p/17076494.html
https://www.cnblogs.com/landeanfen/p/4734252.html
pi算法
https://www.cnblogs.com/beimingdaoren/p/12482435.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)