随便玩玩之C# 14 异步方法
随便玩玩之C# 14 异步方法
举个例子吧。做一碗牛肉面,需要烧水、切菜、切肉,正常人的做法是先烧水,然后切菜切肉炒菜,然后水开了下面条,然后拌一拌即可使用,总结一下就是你干着一件事,我去做另外的事情,你做好了给我说一下。而电脑的做法是烧水等水开,下面条,切菜、切肉,炒菜,然后拌一拌,总结一下就是你要一个做完才能做下一步。
async/await由三部分组成:调用方法、异步函数、await表达式。调用方法调用异步函数,异步函数包含await表达式。
1.异步语法
没有异步的普通做法,代码如下。
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()计算结果出了再显示结果。不耽误去做别的事情。
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,添加如下代码:
private void Button_Click(object sender, RoutedEventArgs e) { Thread.Sleep(5000); }
运行程序。
这是没有使用异步编程的程序,当点击数据计算按钮后,程序后停止5秒,程序界面卡住,无法拖动,textbox也无法点击。
修改代码为异步模式。
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