博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net 4.5 异步编程初试(async和await)
阅读量:5890 次
发布时间:2019-06-19

本文共 2887 字,大约阅读时间需要 9 分钟。

前言

  最近自己在研究Asp.Net Web API。在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过,所以就稍微的学习了解一下。这两篇文章是:

Calling a Web API From a .NET Client (C#) 

Calling a Web API From a WPF Application(C#) 

     关于异步编程的简单理解:

    在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单。通过特性可以将这项复杂的工作交给编译器来完成了。之前传统的方式来实现异步编程较为复杂,这样对于程序猿来说处理起来比较困难,调试也没那么方便,后续的维护工作也比较痛苦。

   Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NET Framework 或 Windows Runtime的资源创建一个异步方法如同创建一个同步方法一样容易。

   这里还有两篇是我之前对多线程简单学习的入门

   

 

  接下来通过VS2013 创建一个基于.NET4.5的控制台应用程序进行尝试。

简单示例

 先直接把简单的代码贴出来,如下所示

///         /// 同步方法打印Hello World        ///         public static void PrintHelloWorld()        {            Console.WriteLine("同步方法调用开始");            Console.WriteLine("同步方法:Hello World");            Thread.Sleep(1000);            Console.WriteLine("退出同步方法");        }        ///         /// 异步方法打印Hello World        ///         public async static void AsyncPrintHelloWorld()        {            Console.WriteLine("异步方法调用开始");            Console.WriteLine("异步方法:Hello World");            await Task.Delay(1000);            Console.WriteLine("退出异步方法");        }

上面注释中也有进行说明,第一个是同步方法,第二个是异步方法。同步方法可以通过Thread.Sleep(1000);暂停方法执行1000ms,同样的异步方法可以通过await Task.Delay(1000)来处理,而且在异步方法的声明中要加入async的关键字。

接下来是简单的调用

static void Main(string[] args)        {            Console.WriteLine("======同步方法调用=====");            PrintHelloWorld();            Console.WriteLine("同步方法调用结束");            Console.WriteLine("======异步方法调用=====");            AsyncPrintHelloWorld();            Console.WriteLine("异步方法调用结束");            Console.ReadLine();        }

F5执行后结果如下

通过执行结果可以很明显的看出,调用的同步方法里面是顺序执行的,而在异步方法中不一样,当通过Task.Delay(1000)暂停当前方法的时候,其方法外面的下面的方法会继续执行,也就是打印“异步方法调用结束”的语句。

可以发现使用了关键字之后,同步与异步的语法差别很小。随着.NET4.5的推出,许多类库和已有类库都将支持这种新型的异步语法,比如我正在学习的HTTPClient等等。

进一步说明

 上面的演示只是通过简单的void的方法进行演示的,当然肯定可以带上返回值的额。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace Async{    class Program    {        static void Main(string[] args)        {            var ret = AsyncAdd("累死了,真想不出啥好的例子来调用");            Console.WriteLine(ret.Result);            Console.ReadLine();        }                    ///异步打印传入的字符串        public async static Task
AsyncAdd(string str) { string result = await PringString(str); return result; } public async static Task
PringString(string str) { return "Hello World" + str; } }}

通过运行其实和同步的是一样的,只不过看看如何来定义异步方法的返回值,根据Task<T>来进行定义。

如果指定Task<TResult>为返回结果,那么这个方法必须包含return指定的TResult结果的语句。

 

一个async方法里通常包含一个或多个的对应的await操作符,但如果没有await表达式也不会导致编译错误。但如果调用一个async方 法,却不使用await关键字来标记一个挂起点的话,程序将会忽略async关键字并以同步的方式执行

总结

 1.一个异步方法的声明中必然包含一个async的修饰符。

 2.异步方法的方法名可以以“Async”结尾。

 3.Task<TResult> 当你的方法有返回值时,那么TResult即返回值的类型

 4.方法通常至少包含一个await表达式。

 

关于async和await的学习暂时就这么多,皮毛的皮毛,不过暂时已经足够了,等有时间了可以再深入的进行研究。

转载地址:http://wxysx.baihongyu.com/

你可能感兴趣的文章
python开发_python文件操作
查看>>
iPhone 已停用
查看>>
CSS3之边框图片border-image
查看>>
图片轮换cycle插件的运用
查看>>
【Oracle】两个表Join关联更新
查看>>
ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
查看>>
Eclipse console文本换行
查看>>
微信支付开发(11) Native支付
查看>>
HDFS dfsclient写文件过程 源码分析
查看>>
【设计模式】—— 代理模式Proxy
查看>>
ejabberd
查看>>
博客园博客自动生成三级目录(generate three levels content using JS in cnblogs)
查看>>
联通高管频频出走:通信业已成鸡肋?
查看>>
关于多线程的那些事
查看>>
js 将json字符串转换为json对象的方法解析
查看>>
1. Two Sum
查看>>
让浏览器不再显示 https 页面中的 http 请求警报
查看>>
hdu4893Wow! Such Sequence! (线段树)
查看>>
Android 最简单的SD卡文件遍历程序
查看>>
JavaScript获取DOM元素位置和尺寸大小
查看>>