C# 使用Async 和Await 的异步编程
1. 了解
通过使用异步变成,你可以避免性能瓶颈并增强应用程序的总体响应能力。但是编写异步应用程序的传统技术可能比较复杂。使它们难以编写,调试和维护。
C#5引入一种简单方法,即是异步编程。此方法利用了.Net Framework4.5 及更高版本,.NET core和 windows 运行时中的异步支持。编译器可执行开发人员曾进行的高难度工作,且应用程序保留了一个类似于同步代码的逻辑结构。因此,你只需做一部分工作就可以获得异步变成的所有好处。
2. 异步编程提升响应能力
异步对可能被屏蔽的活动(如web访问)至关重要。对Web 资源的访问有事很慢或会延迟。如果此类活动在同步过程总被屏蔽,整个应用必须等待。在异步工程中,应用程序可继续执行不依赖Web资源的其他工作,直至潜在阻止任务完成。
下表显示异步编程提高响应能力的典型区域,列出了 .NET 和windows 运行是API 包含支持的异步编程方式
应用程序区域 | 包含异步方法的.NET 类型 | 包含异步方法的Winows 运行时类型 |
---|---|---|
web访问 | HttpClient | SyndicationClient |
使用文件 | StreamWriter,streamReader,XmlReader | StorageFile |
使用图像 | – | MediaCapture,BitMapEncoder,BitmapDecoder |
WCF编程 | 异步同步操作 |
3. 异步方法更容易编写
C# 中Async 和Await关键字是异步编程的核心。通过这连个关键字,可以使用 .NET framework,.NET Core 或 Windows 运行中的资源,轻松创建异步方法(几乎和创建同步方法一样简单)。使用async 关键字定义的异步方法简称“异步方法”
4. 下面的示例演示了一种异步方法。
// -该方法有一个异步修饰符。
// 返回类型是Task或Task<T>。
// 这里是Task<int>,因为return语句返回一个整数。
// -方法名以“Async”结尾。
async Task<int> AccessTheWebAsync()
{
//您需要向System.Net添加一个引用。Http声明客户端。
HttpClient client = new HttpClient();
// GetStringAsync返回一个任务<string>。这意味着当你等待
// 你会得到一个字符串(urlContents)。
Task<String> getStringTask = client.GetStringAsync("https://msdn.microsofe.com");
//您可以在这里完成不依赖于GetStringAsync字符串的工作。
DoIndependentWork();
// wait操作符挂起AccessTheWebAsync。
// - AccessTheWebAsync在getStringTask完成之前不能继续。
// -同时,控件返回给AccessTheWebAsync的调用者。
// -当getStringTask完成时,这里将恢复控制。
// - wait操作符然后从getStringTask检索字符串结果。
String urlContents = await getStringTask;
// return语句指定一个整数结果。
//任何正在等待AccessTheWebAsync的方法检索长度值。
return urlContents.Length;
}
private void DoIndependentWork()
{
Console.WriteLine("Working......");
}
5. API 异步方法
你可能想知道从何处可以找到 GetStringAsync等支持异步变成的方法,.NET Framework4.5或更高版本以及.NET core包含许多可与 async 和 await 结合使用 的成员。可以通过追加到成员名称的“Async”后缀和 Task或Task 的返回类型,
识别这些成员。例如,System.IO.Stream 类包含 CopyToAsync、ReadAsync 和 WriteAsync 等方法,以及同步方法 CopyTo、Read 和 Write。
6. 线程
异步方法旨在成为非阻止操作,异步方法中的await 表达式在等待的任务正在运行时不会阻止当前线程,相反,表达式在注册方法的其余部分,并将控件返回到异步方法的调用方。
async 和 await 关键字不会创建其他线程,因为异步方法不会再其自身线程上运行。因此不需要多线程。只有当方法处于活动状态,该方法将在党建同步上下文中运用并使用线程上的时间。
7. async 和wait
如果使用async 修饰符将某种方法指定为异步方法,即启用一下两种功能。
- 标记的异步方法可以使用await 来指定暂停点。await 运算符通知编译器异步方法:在等待的异步过程完成后才能继续通过该店。同时,控制返回值异步方法的调用方。异步方法在 await表达式执行时暂停,不构成方法退出,只会导致finally代码块不运行。
- 标记的异步方法本身可以通过调用他的方法等待 异步方法通常包含await运算符的一个或多个示例。但缺少await 运算符也不会导致生成编译器错误。如果异步方法未使用await 运算符标记暂停点,那么异步方法会作为同步方法执行。即使有async修饰符,也不例外。