1,异步操作能避免阻塞UI线程,提高用户响应。背后技术手段是由编译器自动使用后台线程池。
2,异步方法用async关键字修饰,返回类型用Task或Task<T>,T表示return语句返回的的数据类型。
/// <summary> ???????/// 异步访问 Web ????????/// </summary> ???????/// <returns></returns> ???????/// <remarks> ???????/// 方法签名的 3 要素: ???????/// ????① async 修饰符 ???????/// ????② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型 ???????/// ????③ 方法名以 Async 结尾 ???????/// </remarks> ???????async Task<int> AccessTheWebAsync() ???????{ ???????????//记得 using System.Net.Http 哦 ???????????var client = new HttpClient(); ???????????//执行异步方法 GetStringAsync ???????????Task<string> getStringTask = client.GetStringAsync("http://www.google.com.hk/"); ???????????//假设在这里执行一些非异步的操作 ???????????Do(); ???????????//等待操作挂起方法 AccessTheWebAsync ???????????//直到 getStringTask 完成,AccessTheWebAsync 方法才会继续执行 ???????????//同时,控制将返回到 AccessTheWebAsync 方法的调用方 ???????????//直到 getStringTask 完成后,将在这里恢复控制。 ???????????//然后从 getStringTask 拿到字符串结果 ???????????string urlContents = await getStringTask; ???????????//返回字符串的长度(int 类型) ???????????return urlContents.Length; ???????}
如果 AccessTheWebAsync 在调用 GetStringAsync() 时没有其它操作(如:代码中的 Do()),你可以用这样的方式来简化代码。
string urlContents = await client.GetStringAsync("http://www.google.com.hk/");
3, 简单总结:
(1)方法签名包含一个 async 修饰符。
(2)根据约定,异步方法的名称需要以“Async”后缀为结尾。
(3)3 种返回类型:
① Task<TResult>:返回 TResult 类型。
② Task:没有返回值,即返回值为 void。
③ void:只适用于异步事件处理程序。
(4)方法通常包含至少一个 await 表达式,该表达式标记一个点,我们可以成为悬挂点,在该点上,直到等待的异步操作完成,之后的方法才能继续执行。 与此同时,该方法将挂起,并将控制权返回到方法的调用方。
需要使用异步方法的话,我们直接在系统内部使用所提供的关键字 async 和 await 就可以了,剩余的其它事情,就留给编译器吧。
4,返回类型:
static async Task<Guid> Method1Async() //Task<Guid> ???????{ ???????????var result = Guid.NewGuid(); ???????????await Task.Delay(1); ???????????//这里返回一个 Guid 的类型 ???????????return result; ???????} ???????static async Task Method2Async() //Task ???????{ ???????????//Do... ???????????await Task.Delay(1); ???????????//Do... ???????????//这里没有 return 语句 ???????}
//调用 Method1Async ???????????//方式一 ???????????Task<Guid> t1 = Method1Async(); ???????????Guid guid1 = t1.Result; ???????????//方式二 ???????????Guid guid2 = await Method1Async(); ???????????//调用 Method2Async ???????????//方式一 ???????????Task t2 = Method2Async(); ???????????await t2; ???????????//方式二 ???????????await Method2Async();
.net 4.5 异步编程
原文地址:https://www.cnblogs.com/TianPing/p/9786180.html