async和await关键字是.NET 4.5新增加的异步编程方式,通过使用这两个关键字可以轻松便捷的编写异步方法。使用async关键字声明异步方法,使用await关键字等待和获取异步方法返回的结果。需要注意的是,一旦声明了await关键字,将会阻止当前线程直到异步调用返回结果。(点击此处查看MSDN官方说明

下面的是使用控制台编写的简单测试代码:

class Program
{
static void Main(string[] args)
{
Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine("主线程开始执行,时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine("--------------------------------------------------------------------");
/*
* 主线程调用ShowInfoAsync异步方法
* 使用async和await关键字
*/
ShowInfoAsync();
Console.WriteLine(string.Empty);
/*同步操作*/
for (int i = ; i < ; i++)
{
Console.WriteLine(string.Format("主线程同步循环显示序号:{0},时间:{1}", i.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
} Console.WriteLine("--------------------------------------------------------------------");
Console.WriteLine("主线程执行结束,时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine("--------------------------------------------------------------------");
Console.ReadKey();
} /// <summary>
/// 异步显示输出信息
/// </summary>
static async void ShowInfoAsync()
{ //声明要调用的异步方法,获取异步任务操作类 Task
Task<string> getTask = GetDataAsync(); Console.WriteLine(string.Empty);
Console.WriteLine(string.Format("开始执行异步获取数据方法,时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); /*
* 异步获取数据并显示
* 这里使用 await 关键词启用并等待异步返回结果
* 在声明await关键词的地方线程就会在此等待返回结果
* 只有返回结果才会继续执行下面步骤
*/
string strShowString = await getTask; Console.WriteLine("***************************************************************");
Console.WriteLine(string.Format("异步获取数据执行结束,获取数据值:{0},时间:{1}", strShowString, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
Console.WriteLine("***************************************************************");
Console.WriteLine(string.Empty);
} /// <summary>
/// 异步获取返回的数据
/// </summary>
/// <returns></returns>
static async Task<string> GetDataAsync()
{
//这里也可以使用Task.Run
return await Task.Factory.StartNew(() =>
{
Thread.Sleep();
string strReturn = string.Empty;
for (int i = ; i < ; i++)
{
Thread.Sleep();
Console.WriteLine(string.Format("异步获取数据,第{0}次循环,时间:{1}", i + , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
strReturn += i.ToString();
}
return strReturn;
});
}
}

最终返回结果如下:

代码中由于使用async定义了ShowInfoAsync方法,所以ShowInfoAsync就变成一个异步调用的方法,需要注意的是声明了async关键字的方法中一定要使用await关键字声明异步操作的返回结果,否则方法将作为同步方法执行,就不是异步执行了。可以看到代码中await声明的对象是Task<string>这个类,Task<TResult>

类表示一个可以返回值的异步操作,所以代码中GetDataAsync也必须是一个异步方法,而且返回值必须是Task类型或者Task<TResult>。

关于使用这两个关键字官方说明如下:

  • 方法签名包含一个 Async 或 async 修饰符
  • 按照约定,异步方法的名称以“Async”后缀结尾。
  • 返回类型为下列类型之一:
    • 如果你的方法有操作数为 TResult 类型的返回语句,则为 Task<TResult>
    • 如果你的方法没有返回语句或具有没有操作数的返回语句,则为 Task
    • 如果你编写的是异步事件处理程序,则为 Void(Visual Basic 中为 Sub)。
    • 有关详细信息,请参见本主题后面的“返回类型和参数”(点击此处看官网完整说明)。
    • 方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控件返回到方法的调用方。 本主题的下一节将解释悬挂点发生的情况。

这里附上官方MSDN的链接:

【转】.NET 4.5 使用async和await关键字调用异步方法的更多相关文章

  1. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  2. 异步编程,采用WorkgroupWorker,async和await关键字

    金科玉律:不要在UI线程上执行耗时的操作:不要在除了UI线程之外的其他线程上访问UI控件! NET1.1的BeginInvoke异步调用,需要准备3个方法:功能方法GetWebsiteLength,结 ...

  3. Async 与 Await 关键字研究

    1        Aynsc 和 Await 关键字的研究 在 .NET 4.0 以后,基于 Task 的异步编程模式大行其道,因其大大简化了异步编程所带来的大量代码工作而深受编程人员的欢迎,如果你曾 ...

  4. async和await关键字实现异步编程

    async和await关键字实现异步编程 异步编程   概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...

  5. 为什么我们要使用Async、Await关键字

    前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...

  6. .NET中的async和await关键字使用及Task异步调用实例

    其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...

  7. 多线线程async与await关键字

    创建线程 //这里面需要注意的是,创建Thread的实例之后,需要手动调用它的Start方法将其启动. //但是对于Task来说,StartNew和Run的同时,既会创建新的线程,并且会立即启动它. ...

  8. 可移植类库无法使用async、await关键字

    今天遇到了如题所示的问题,平台已经选择了.net 4.5了,可是就是编译不通过,await关键字下出现了红色下划线. 解决方法:安装一个Bcl的补丁包. https://www.nuget.org/p ...

  9. async await 同步方法调用异步方法死锁

    同步方法调用异步方法.GetAwaiter().GetResult()计算函数超时,异步方法所有的回调操作都会期望返回到主线程. 所以会导致各种线程死锁.异步方法中使用ConfigureAwait(f ...

随机推荐

  1. 食物(矩阵快速幂)(DP)

    这个题..我们可以想到用递推写!!qwq(好吧,其实我的DP水平不高啊qwq) 就是我们以两个为单位(一共九种组合情况),然后往后面推下一位的情况. 通过手动模拟,我们可以找到它们之间的递推关系(详见 ...

  2. input获取、失去焦点对输入内容做验证

    获取焦点 # 重新获取焦掉后,会将指定标签中的css样式删除,这里为标记错误的css样式(将文本框标红) $("form input").focus(function () { $ ...

  3. 深入了解java虚拟机(JVM) 第四章 对象的创建

    一.对象的创建过程 对象的创建过程大致可以分为六步,其中对象的分配尤为重要: 二.对象分配内存 一般来说对象分配内存有两种方式: 第一种是指针碰撞,这是一种比较理想的方式:如果Java堆是绝对规整的: ...

  4. 3.iptables 扩展模块

    --tcp-flags 用于匹配报文的tcp头的标志位 iptables -t filter -I INPUT -p tcp -m tcp --dport 22  --tcp-flags SYN,AC ...

  5. Linux下的信号量

    首先,什么是信号量? 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识.信号量在此过程中负责操作的互 ...

  6. TCP/IP协议之分层

     应用层和运输层只在端系统(End System)中实现, 底层协议在中间系统(Intermediate System)实现 ICMP和IGMP属于网络层的附属协议.虽然其内容是IP数据报的载荷(P ...

  7. 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇

    864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...

  8. 洛谷 P3224 [HNOI2012]永无乡

    题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...

  9. spring切面拦截实现

    1.建立业务类(英雄战斗实现类) package com.g2.api; public interface Weapon { int attack(); String getName(); } pac ...

  10. Python练习 | Web本质Socket

    #--------------------------------客户端-------------------------------------- # 导入socket库 import socket ...