标签:wait stat state ring span The handler rest complete
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();
标签:wait stat state ring span The handler rest complete
原文地址:https://www.cnblogs.com/TianPing/p/9786180.html