C# 中的Async 和 Await 的用法详解

2022-12-19 0 170

不可否认C#提供Async和AwaitURL来实现触发器程式设计。在责任编辑中,他们将协力深入探讨并如是说什么是Async 和 Await,以及如何在C#中采用Async 和 Await。

反之亦然责任编辑的文本也多半是译者的,或是说加之了他们的认知展开了相关习题的补足,假如你认为他们的英语水平还极好,大可直接重定向到该文结尾查阅书名镜像展开写作。

译者:依乐祝

书名镜像:https://www.cnblogs.com/yilezhu/p/10555849.html

写在后面

好景不长C# 5.0黄金时代导入async和awaitURL后,触发器程式设计就显得大行其道。特别在现在的.NET Core黄金时代,假如你的标识符中没有出现async或是awaitURL,单厢让人感觉到很怪异。

想像呵呵当他们在处置UI和按键空格键时,他们须要运转两个较长天数运转的方式,比如说加载两个大文档或其它须要极短天数的各项任务,在此种情况下,整座插件必须等候这个较长天数运转的各项任务顺利完成才算顺利完成整座各项任务。

换言之,假如并行插件中的任何人民主化被堵塞,则整座插件将被堵塞,他们的插件将暂停积极响应,直至整座各项任务顺利完成。

在此种情况下,触发器程式设计将十分管用。通过采用触发器程式设计,应用程序可以继续展开不倚赖整座各项任务顺利完成的其它工作。

在Async 和 awaitURL的协助下,使触发器程式设计显得很单纯,而且他们将赢得现代触发器程式设计的所有益处。

示例传授

假定他们分别采用了三种方式,即Method 1和Method 2,这三种方式不互相冲突,而Method 1须要极短天数就可以顺利完成它的各项任务。在并行程式设计中,它将继续执行第两个Method 1,并等候该方式的顺利完成,然后继续执行Method 2。因此,这将是两个天数专门化的过程,即便这三种方式并不互相冲突。

他们可以采用单纯的多线程程式设计并行运转所有方式,但是它会堵塞UI并等候顺利完成所有各项任务。要解决这个问题,他们必须在现代程式设计中编写很多的标识符,但是现在他们有了Async 和 awaitURL,那么他们将通过书写很少的并且简洁的标识符来解决这个问题。

此外,他们还将看到更多的示例,假如任何人第三个方式(如Method 3)都倚赖Method 1,那么它将在WaitURL的协助下等候Method 1的顺利完成。

Async 和 await是标识符标记,它标记标识符位置为各项任务顺利完成后控件应该恢复的位置。

下面让他们举几个例子来更好展开认知吧

C#中Async 和 awaitURL的示例

他们将采用控制台插件展开演示。

第两个例子

在这个例子中,他们将采取两个不互相冲突的方式。

class Program { static void Main(string[] args){ Method1(); Method2(); Console.ReadKey(); }public static async Task Method1() { awaitTask.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中的参数之前,他们必须采用AWAITURL,为此,他们必须采用调用方式中的async URL。

在控制台插件的Main方式中,因为不能采用asyncURL而不能采用await URL,因为它会给出下面给出的错误。(但是假如你采用的是C#7.1及以上的方式是不会有问题的,因为C#7.1及以上的语法支持Mian方式前加async)

C# 中的Async 和 Await 的用法详解

他们将创建两个新的方式,作为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() { intcount =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的返回类型。在这里,awaitURL对于等待Method 1各项任务的顺利完成起着至关重要的作用。

输出

第三个例子

.NET Framework4.5中有一些支持API,Windows运转时包含支持触发器程式设计的方式。

在Async 和 awaitURL的协助下,他们可以在实时项目中采用所有这些,以便更快地继续执行各项任务。

包含触发器方式的API有HttpClient, SyndicationClient, StorageFile, StreamWriter, StreamReader, XmlReader, MediaCapture, BitmapEncoder, BitmapDecoder 等。

的总长度。

class Program { static void Main() { Task task = newTask(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 = awaittask; 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; } }

在sampleText.txt中,文档包含了太多的字符,因此加载所有字符须要极短天数。

在这里,他们采用触发器程式设计从文档中加载所有文本,所以它不会等候从这个方式赢得两个返回值并继续执行其它标识符行,但是它必须等候下面给出的标识符行,因为他们采用的是等候URL,他们将对下面给出的标识符行采用返回值。

int length = await task; Console.WriteLine(” Total length: “ + length);

随后,将按顺序继续执行其它标识符行。

Console.WriteLine(” After work 1″); Console.WriteLine(” After work 2″);

输出

最后

在这里,他们必须了解十分重要的一点,假如他们没有采用await URL,那么该方式就作为两个并行方式。编译器将向他们显示警告,但不会显示任何人错误。

像上面此种单纯的方式一样,他们可以在C#标识符中使用async 和awaitURL来愉快的展开触发器程式设计了。

最后的最后感谢大家的写作!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务