.NET/C# 使用async和await关键字调用异步方法
2014-12-11 00:00
1061 查看
摘要: async和await关键字是.NET 4.5新增加的异步编程方式,通过使用这两个关键字可以轻松便捷的编写异步方法。使用async关键字声明异步方法,使用await关键字等待和获取异步方法返回的结果。需要注意的是,一旦声明了await关键字,将会阻止当前线程直到异步调用返回结果。
出处:http://shiyousan.com/article/2014/06/635389701226393373.html
下面的是使用控制台编写的简单测试代码:
最终返回结果如下:
代码中由于使用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的链接:
使用 Async 和 Await 的异步编程(C# 和 Visual Basic)
async(C# 参考)
await(C# 参考)
出处:http://shiyousan.com/article/2014/06/635389701226393373.html
下面的是使用控制台编写的简单测试代码:
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 = 0; i < 3; 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(500); string strReturn = string.Empty; for (int i = 0; i < 5; i++) { Thread.Sleep(500); Console.WriteLine(string.Format("异步获取数据,第{0}次循环,时间:{1}", i + 1, 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的链接:
使用 Async 和 Await 的异步编程(C# 和 Visual Basic)
async(C# 参考)
await(C# 参考)
相关文章推荐
- .NET 4.5 使用async和await关键字调用异步方法
- 【转】.NET 4.5 使用async和await关键字调用异步方法
- C# 中 async/await 调用传统 Begin/End 异步方法
- C# 异步调用之async及await关键字
- 在Asp.net中调用异步方法--使用信号量
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用
- 在Asp.net中调用异步方法-使用信号量
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(8):服务器端和客户端数据类型的自动转换:数组类型
- 第三部分 02 在ASP.NET AJAX应用程序中使用JavaScript异步调用Page的方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- dhl:C#异步方法调用(使用委托,在委托上调用BeginInvoke方法)
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(10):服务器端和客户端数据类型的自动转换:以XML方式序列化数据、小结
- VB.NET中使用代表对方法异步调用
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(3):保持用户上下文
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 在Asp.net中调用异步方法-使用信号量
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(5):服务器端和客户端数据类型的自动转换:基本类型和枚举类型
- (转) C#异步调用使用匿名方法Lambda表达式