【转】.NET 4.5 使用async和await关键字调用异步方法
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关键字调用异步方法的更多相关文章
- 浅谈async、await关键字 => 深谈async、await关键字
前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...
- 异步编程,采用WorkgroupWorker,async和await关键字
金科玉律:不要在UI线程上执行耗时的操作:不要在除了UI线程之外的其他线程上访问UI控件! NET1.1的BeginInvoke异步调用,需要准备3个方法:功能方法GetWebsiteLength,结 ...
- Async 与 Await 关键字研究
1 Aynsc 和 Await 关键字的研究 在 .NET 4.0 以后,基于 Task 的异步编程模式大行其道,因其大大简化了异步编程所带来的大量代码工作而深受编程人员的欢迎,如果你曾 ...
- async和await关键字实现异步编程
async和await关键字实现异步编程 异步编程 概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...
- 为什么我们要使用Async、Await关键字
前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...
- .NET中的async和await关键字使用及Task异步调用实例
其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...
- 多线线程async与await关键字
创建线程 //这里面需要注意的是,创建Thread的实例之后,需要手动调用它的Start方法将其启动. //但是对于Task来说,StartNew和Run的同时,既会创建新的线程,并且会立即启动它. ...
- 可移植类库无法使用async、await关键字
今天遇到了如题所示的问题,平台已经选择了.net 4.5了,可是就是编译不通过,await关键字下出现了红色下划线. 解决方法:安装一个Bcl的补丁包. https://www.nuget.org/p ...
- async await 同步方法调用异步方法死锁
同步方法调用异步方法.GetAwaiter().GetResult()计算函数超时,异步方法所有的回调操作都会期望返回到主线程. 所以会导致各种线程死锁.异步方法中使用ConfigureAwait(f ...
随机推荐
- 不得不说fdm真的好用
记忆力太差系列 挺好用的软件 下载器FDM真的很好用
- Mysql数据操作《二》单表查询
单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 关键字的执行 ...
- python 调试器
pdb https://www.zhihu.com/question/21572891 https://zhuanlan.zhihu.com/p/43846098
- centos6 编译安装nodejs4.3
官网下载源码包 https://nodejs.org/en/download/ source code #下载 wget https://nodejs.org/dist/v4.3.2/node-v4. ...
- luogu4383 [八省联考2018]林克卡特树(带权二分+dp)
link 题目大意:给定你 n 个点的一棵树 (边有边权,边权有正负) 你需要移除 k 条边,并连接 k 条权值为 0 的边,使得连接之后树的直径最大 题解: 根据 [POI2015]MOD 那道题, ...
- leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)
题目描述: Given an integer array with even length, where different numbers in this array represent diffe ...
- Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件)
Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件) https://blog.csdn.net/woainishifu/article/details/79712110 我们在做项 ...
- SCTP
流控制传输协议是为了替代UDP.TCP实现七号信令传输的. HS DPA high speed download packet access. HS UPA ... 通信人 Orthogonal f ...
- mkvirtualenv创建python虚拟环境
为什么要创建虚拟环境呢? 如果在我们本地开发好几个项目,每个项目又用到很多第三方插件,如果没没用创建虚拟环境,那么本地项目插件就会很多很乱,如果有虚拟环境就不一样了 虚拟环境安装 pip instal ...
- 2.6 Rust Slice Type
字符串操作 fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in by ...