ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# Await/Async

2022-06-19 22:03:28  阅读:122  来源: 互联网

标签:异步 await C# Await 运算符 DownloadDocsMainPageAsync ExampleMethodAsync Async 方法


1.await 运算符

官方解释:

await 运算符暂停对其所属的 await 方法的求值,直到其操作数表示的异步操作完成。 异步操作完成后,await 运算符将返回操作的结果(如果有)。 当 await 运算符应用到表示已完成操作的操作数时,它将立即返回操作的结果,而不会暂停其所属的方法。 await 运算符不会阻止计算异步方法的线程。 当 await 运算符暂停其所属的异步方法时,控件将返回到方法的调用方。

 

在下面的示例中,HttpClient.GetByteArrayAsync 方法返回 Task<byte[]> 实例,该实例表示在完成时生成字节数组的异步操作。 在操作完成之前,await 运算符将暂停 DownloadDocsMainPageAsync 方法。 当 DownloadDocsMainPageAsync 暂停时,控件将返回到 Main 方法,该方法是 DownloadDocsMainPageAsync 的调用方。 Main 方法将执行,直至它需要 DownloadDocsMainPageAsync 方法执行的异步操作的结果。 当 GetByteArrayAsync 获取所有字节时,将计算 DownloadDocsMainPageAsync 方法的其余部分。 之后,将计算 Main 方法的其余部分。

 1 using System;
 2 using System.Net.Http;
 3 using System.Threading.Tasks;
 4 
 5 public class AwaitOperator
 6 {
 7     public static async Task Main()
 8     {
 9         Task<int> downloading = DownloadDocsMainPageAsync();
10         Console.WriteLine($"{nameof(Main)}: Launched downloading.");
11 
12         int bytesLoaded = await downloading;
13         Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
14     }
15 
16     private static async Task<int> DownloadDocsMainPageAsync()
17     {
18         Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");
19 
20         var client = new HttpClient();
21         byte[] content = await client.GetByteArrayAsync("https://docs.microsoft.com/en-us/");
22 
23         Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
24         return content.Length;
25     }
26 }
27 // Output similar to:
28 // DownloadDocsMainPageAsync: About to start downloading.
29 // Main: Launched downloading.
30 // DownloadDocsMainPageAsync: Finished downloading.
31 // Main: Downloaded 27700 bytes.
View Code

 

1.async运算符

官方解释:

使用 async 修饰符可将方法、lambda 表达式匿名方法指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法 。 如下示例定义了一个名为 ExampleMethodAsync 的异步方法:

C#

public async Task<int> ExampleMethodAsync()
{
    //...
}

如果不熟悉异步编程,或者不了解异步方法如何在不阻止调用方线程的情况下使用 await 运算符执行可能需要长时间运行的工作,请参阅使用 Async 和 Await 的异步编程中的说明。 如下代码见于一种异步方法中,且调用 HttpClient.GetStringAsync 方法:

C#
string contents = await httpClient.GetStringAsync(requestUrl);

异步方法同步运行,直至到达其第一个 await 表达式,此时会将方法挂起,直到等待的任务完成。 同时,如下节示例中所示,控件将返回到方法的调用方。

如果 async 关键字修改的方法不包含 await 表达式或语句,则该方法将同步执行。 编译器警告将通知你不包含 await 语句的任何异步方法,因为该情况可能表示存在错误。 请参阅编译器警告(等级 1)CS4014

async 关键字是上下文关键字,原因在于只有当它修饰方法、lambda 表达式或匿名方法时,它才是关键字。 在所有其他上下文中,都会将其解释为标识符。

示例

下面的示例展示了异步事件处理程序 StartButton_Click 和异步方法 ExampleMethodAsync 之间的控制结构和流程。 此异步方法的结果是 Web 页面的字符数。 此代码适用于在 Visual Studio 中创建的 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用;请参见有关设置应用的代码注释。

可以在 Visual Studio 中将此代码作为 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用运行。 需要一个名为 StartButton 的按钮控件和一个名为 ResultsTextBox 的文本框控件。 切勿忘记设置名称和处理程序,以便获得类似于以下代码的内容:

XAML
<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"
        Click="StartButton_Click" Name="StartButton"/>
<TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap"
         Text="&lt;Enter a URL&gt;" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>

将代码作为 WPF 应用运行:

  • 将此代码粘贴到 MainWindow.xaml.cs 中的 MainWindow 类中。
  • 添加对 System.Net.Http 的引用。
  • 为 System.Net.Http 添加一个 using 指令。

将此代码作为 Windows 应用商店应用运行:

  • 将此代码粘贴到 MainPage.xaml.cs 中的 MainPage 类中。
  • 为 System.Net.Http 和 System.Threading.Tasks 添加 using 指令。
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int>, which means that the method
    // eventually produces an int result. However, ExampleMethodAsync returns
    // the Task<int> value as soon as it reaches an await.
    ResultsTextBox.Text += "\n";

    try
    {
        int length = await ExampleMethodAsync();
        // Note that you could put "await ExampleMethodAsync()" in the next line where
        // "length" is, but due to when '+=' fetches the value of ResultsTextBox, you
        // would not see the global side effect of ExampleMethodAsync setting the text.
        ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length);
    }
    catch (Exception)
    {
        // Process the exception if one occurs.
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();
    int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
    ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
    // After the following return statement, any method that's awaiting
    // ExampleMethodAsync (in this case, StartButton_Click) can get the
    // integer result.
    return exampleInt;
}
// The example displays the following output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292
View Code

 

标签:异步,await,C#,Await,运算符,DownloadDocsMainPageAsync,ExampleMethodAsync,Async,方法
来源: https://www.cnblogs.com/HomeSapiens/p/16391552.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有