应用程序的main方法中有以下(C# 中的Async 和 Await 的用法详解)
Posted
篇首语:鸟贵有翼,人贵有志。本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用程序的main方法中有以下(C# 中的Async 和 Await 的用法详解)相关的知识,希望对你有一定的参考价值。
应用程序的main方法中有以下(C# 中的Async 和 Await 的用法详解)
众所周知C#提供Async和Await关键字来实现异步编程。在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await。
同样本文的内容也大多是翻译的,只不过加上了自己的理解进行了相关知识点的补充,如果你认为自己的英文水平还不错,大可直接跳转到文章末尾查看原文链接进行阅读。
作者:依乐祝
原文链接:https://www.cnblogs.com/yilezhu/p/10555849.html
写在前面
自从C# 5.0时代引入async和await关键字后,异步编程就变得流行起来。尤其在现在的.NET Core时代,如果你的代码中没有出现async或者await关键字,都会让人感觉到很奇怪。
想象一下当我们在处理UI和按钮单击时,我们需要运行一个长时间运行的方法,比如读取一个大文件或其他需要很长时间的任务,在这种情况下,整个应用程序必须等待这个长时间运行的任务完成才算完成整个任务。
换句话说,如果同步应用程序中的任何进程被阻塞,则整个应用程序将被阻塞,我们的应用程序将停止响应,直到整个任务完成。
在这种情况下,异步编程将非常有用。通过使用异步编程,应用程序可以继续进行不依赖于整个任务完成的其他工作。
在Async 和 await关键字的帮助下,使得异步编程变得很简单,而且我们将获得传统异步编程的所有好处。
实例讲解
假设我们分别使用了两种方法,即Method 1和Method 2,这两种方法不相互依赖,而Method 1需要很长时间才能完成它的任务。在同步编程中,它将执行第一个Method 1,并等待该方法的完成,然后执行Method 2。因此,这将是一个时间密集型的过程,即使这两种方法并不相互依赖。
我们可以使用简单的多线程编程并行运行所有方法,但是它会阻塞UI并等待完成所有任务。要解决这个问题,我们必须在传统编程中编写很多的代码,但是现在我们有了Async 和 await关键字,那么我们将通过书写很少的并且简洁的代码来解决这个问题。
此外,我们还将看到更多的示例,如果任何第三个方法(如Method 3)都依赖于Method 1,那么它将在Wait关键字的帮助下等待Method 1的完成。
Async 和 await是代码标记,它标记代码位置为任务完成后控件应该恢复的位置。
下面让我们举几个例子来更好进行理解吧
C#中Async 和 await关键字的示例
我们将采用控制台应用程序进行演示。
第一个例子
在这个例子中,我们将采取两个不相互依赖的方法。
class Program static void Main(string[] args) Method1();Method2();Console.ReadKey(); public static async Task Method1() await Task.Run(() => for (int i = 0; i < 100; i++) Console.WriteLine(" Method 1"); ); public static void Method2() for (int i = 0; i < 25; i++) Console.WriteLine(" Method 2");
在上面给出的代码中,Method 1和Method 2不相互依赖,我们是从主方法调用的。
在这里,我们可以清楚地看到,方法1和方法2并不是在等待对方完成。
输出
现在来看第二个例子,假设我们有Method 3,它依赖于Method 1
第二个例子
在本例中,Method 1将总长度作为整数值返回,我们在Method 3中以长度的形式传递一个参数,它来自Method 1。
在这里,在传递Method 3中的参数之前,我们必须使用AWAIT关键字,为此,我们必须使用调用方法中的async 关键字。
在控制台应用程序的Main方法中,因为不能使用async关键字而不能使用await 关键字,因为它会给出下面给出的错误。(但是如果你使用的是C#7.1及以上的方法是不会有问题的,因为C#7.1及以上的语法支持Mian方法前加async)
我们将创建一个新的方法,作为CallMethod,在这个方法中,我们将调用我们的所有方法,分别为Method 1、Method 2和Method 3。
class Program static void Main(string[] args) callMethod();Console.ReadKey(); public static async void callMethod() Task<int> task = Method1();Method2(); int count = await task;Method3(count); public static async Task<int> Method1() int count = 0;await Task.Run(() => for (int i = 0; i < 100; i++) Console.WriteLine(" Method 1"); count += 1; ); return count; public static void Method2() for (int i = 0; i < 25; i++) Console.WriteLine(" Method 2"); public static void Method3(int count) Console.WriteLine("Total count is " + count);
在上面给出的代码中,Method 3需要一个参数,即Method 1的返回类型。在这里,await关键字对于等待Method 1任务的完成起着至关重要的作用。
输出
第三个例子
.NET Framework4.5中有一些支持API,Windows运行时包含支持异步编程的方法。
在Async 和 await关键字的帮助下,我们可以在实时项目中使用所有这些,以便更快地执行任务。
包含异步方法的API有HttpClient, SyndicationClient, StorageFile, StreamWriter, StreamReader, XmlReader, MediaCapture, BitmapEncoder, BitmapDecoder 等。
在本例中,我们将异步读取大型文本文件中的所有字符,并获取所有字符的总长度。
class Program static void Main() Task task = new Task(CallMethod);task.Start();task.Wait();Console.ReadLine(); static async void CallMethod() string filePath = "E:\\\\sampleFile.txt"; Task<int> task = ReadFile(filePath); Console.WriteLine(" Other Work 1"); Console.WriteLine(" Other Work 2"); Console.WriteLine(" Other Work 3"); int length = await task;Console.WriteLine(" Total length: " + length); Console.WriteLine(" After work 1"); Console.WriteLine(" After work 2"); static async Task<int> ReadFile(string file) int length = 0; Console.WriteLine(" File reading is stating"); using (StreamReader reader = new StreamReader(file)) // Reads all characters from the current position to the end of the stream asynchronously // and returns them as one string. string s = await reader.ReadToEndAsync(); length = s.Length; Console.WriteLine(" File reading is completed"); return length;
在上面给出的代码中,我们调用ReadFile方法来读取文本文件的内容,并获取文本文件中总字符的长度。
在sampleText.txt中,文件包含了太多的字符,因此读取所有字符需要很长时间。
在这里,我们使用异步编程从文件中读取所有内容,所以它不会等待从这个方法获得一个返回值并执行其他代码行,但是它必须等待下面给出的代码行,因为我们使用的是等待关键字,我们将对下面给出的代码行使用返回值。
int length = await task;Console.WriteLine(" Total length: " + length);
随后,将按顺序执行其他代码行。
Console.WriteLine(" After work 1"); Console.WriteLine(" After work 2");
输出
最后
在这里,我们必须了解非常重要的一点,如果我们没有使用await 关键字,那么该方法就作为一个同步方法。编译器将向我们显示警告,但不会显示任何错误。
像上面这种简单的方式一样,我们可以在C#代码中使用async 和await关键字来愉快的进行异步编程了。
最后的最后感谢大家的阅读!
相关参考
欧姆龙D4BS安全门开关(工控:C#中的串口,网口和PLC通讯)
一.串口通讯方式首先,串口、UART口、COM口、USB口是指的物理接口形式(硬件)。而TTL、RS-232、RS-485是指的电平标准(电信号)。串口:串口是一个泛称,UART、TTL、RS232、RS485都遵循类似的通信时序协议,因此都被通称为串口工控中常...
1、main的意思:adj.主要的;最重要的;n.(通往建筑物的)主管道,总管,输电干线;(建筑物的)污水总管道;水源;煤气源;电源;(水、煤气、电等的)供应系统;下水道系统;2、main的读音:英[meɪn],美[meɪn]。3、[例句]Therearethreemaintypesofcontra...
1、main的意思:adj.主要的;最重要的;n.(通往建筑物的)主管道,总管,输电干线;(建筑物的)污水总管道;水源;煤气源;电源;(水、煤气、电等的)供应系统;下水道系统;2、main的读音:英[meɪn],美[meɪn]。3、[例句]Therearethreemaintypesofcontra...
1、mainly,英语单词,副词,译为“大部分地;主要地”。2、单词发音:[英][ˈmeɪnli][美][ˈmenli]3、[例句]Eventoday,formalverificationismainlyaresearcharea.甚至现在,形式验证主要地用于研究领域。
1、mainly,英语单词,副词,译为“大部分地;主要地”。2、单词发音:[英][ˈmeɪnli][美][ˈmenli]3、[例句]Eventoday,formalverificationismainlyaresearcharea.甚至现在,形式验证主要地用于研究领域。
...釉料、低温瓷釉料、艺术陶瓷釉料应用较多。氧化锌在釉中有较强的助溶作用,能够降低釉面的膨胀系数、提高产品的稳定性、提高产品合格率,同时能增加釉面的光泽与白度,提高釉的弹性。在扩大熔融范围的同时增加釉色的...
...釉料、低温瓷釉料、艺术陶瓷釉料应用较多。氧化锌在釉中有较强的助溶作用,能够降低釉面的膨胀系数、提高产品的稳定性、提高产品合格率,同时能增加釉面的光泽与白度,提高釉的弹性。在扩大熔融范围的同时增加釉色的...
正确书写、理解记忆、熟练掌握化学方程式是很重要的。熟练掌握,不仅要求会写、会配平、会应用;而且要求全面理解有关物质间的物质的量比,快速、准确、高效地利用化学方程式中的定量、定性关系,随机应变地解决高考...
文/王桂宏广告语言中的幽默艺术越来越受到人们的重视,它可以使消费者在轻松愉悦的氛围中接受广告信息,降低抵 触情绪,可以克服艺术情趣不够、商业气味过浓、严肃刻板有余、生动活泼不足的倾向,让消费者在轻松愉...
在涡轮叶片上以极大的倾角对冷却通风收支口进行小孔加工与传统的穿孔工艺比较,电火花穿孔机加工的长处非常显着。传统加工工艺在1mm以下等级上会呈现问题,在0.10~3.0mm(特别状况下至10mm)的直径范围内,机械穿孔完全由...