C# 使用Async 和Await 的异步编程

C# 使用Async 和Await 的异步编程

1. 了解
通过使用异步变成,你可以避免性能瓶颈并增强应用程序的总体响应能力。但是编写异步应用程序的传统技术可能比较复杂。使它们难以编写,调试和维护。
C#5引入一种简单方法,即是异步编程。此方法利用了.Net Framework4.5 及更高版本,.NET core和 windows 运行时中的异步支持。编译器可执行开发人员曾进行的高难度工作,且应用程序保留了一个类似于同步代码的逻辑结构。因此,你只需做一部分工作就可以获得异步变成的所有好处。

2. 异步编程提升响应能力
异步对可能被屏蔽的活动(如web访问)至关重要。对Web 资源的访问有事很慢或会延迟。如果此类活动在同步过程总被屏蔽,整个应用必须等待。在异步工程中,应用程序可继续执行不依赖Web资源的其他工作,直至潜在阻止任务完成。

下表显示异步编程提高响应能力的典型区域,列出了 .NET 和windows 运行是API 包含支持的异步编程方式

应用程序区域包含异步方法的.NET 类型包含异步方法的Winows 运行时类型
web访问HttpClientSyndicationClient
使用文件StreamWriter,streamReader,XmlReaderStorageFile
使用图像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修饰符,也不例外。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值