.net4.5使用async和await异步编程实例
关于异步编程的简单理解:
在.net4.5中新增了异步编程的新特性async和await,使得异步编程更为简单。通过特性可以将这项复杂的工作交给编译器来完成了。之前传统的方式来实现异步编程较为复杂,这样对于程序猿来说处理起来比较困难,调试也没那么方便,后续的维护工作也比较痛苦。
async和await关键字是c#异步编程的核心。通过使用这两个关键字,你可以使用.net framework 或 windows runtime的资源创建一个异步方法如同创建一个同步方法一样容易。
接下来通过vs2013 创建一个基于.net4.5的控制台应用程序进行尝试。
先直接把简单的代码贴出来,如下所示
/// <summary>
/// 同步方法打印hello world
/// </summary>
public static void printhelloworld()
{
console.writeline("同步方法调用开始");
console.writeline("同步方法:hello world");
thread.sleep(1000);
console.writeline("退出同步方法");
}
/// <summary>
/// 异步方法打印hello world
/// </summary>
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<string> asyncadd(string str)
{
string result = await pringstring(str);
return result;
}
public async static task<string> 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表达式。
推荐阅读
-
.net4.5使用async和await异步编程实例
-
Js异步编程Promise和async/await方式个人总结
-
.net异步编程async和await的讨论收获
-
.Net异步编程之Async与Await的使用
-
C#中异步编程4async与await异步程序开发的实例分析
-
vue中使用async、await和promise实现异步API的同步调用
-
vue 使用 async 和 await 实现异步 axios 同步化(实战案例:数据异步校验通过后,再执行保存)
-
使用async和await优化异步事件
-
.NET中的async和await关键字使用及Task异步调用实例
-
.net4.5新特性之异步编程(Async和Await)的使用