Asp.net Web API消费代码中Async与Await的作用及关联疑问
聊聊Web API消费代码里的Async/Await用法
嘿,针对你这段Xamarin调用Web API的代码,我来详细解答你关于Async和Await的两个疑问~
先贴出你参考的代码方便对照:
public async Task<List<TodoItem>> RefreshDataAsync () { // RestUrl = http://developer.xamarin.com:8081/api/todoitems/ var uri = new Uri (string.Format (Constants.RestUrl, string.Empty)); var response = await client.GetAsync (uri); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync (); Items = JsonConvert.DeserializeObject <List<TodoItem>> (content); } }
1. 为啥这段代码要用Async和Await?
这俩组合是.NET里处理异步操作的核心,放在Web API调用场景里简直是刚需:
- 避免UI卡死:移动应用的UI线程是单线程的,如果用同步方式调用API(比如直接用
client.Get()),网络请求的几秒里UI会完全冻结,用户点啥都没反应,体验极差。Async/Await会让网络请求在后台线程执行,UI线程该干嘛干嘛,等请求完成了再回来处理结果,全程保持界面流畅。 - 高效利用资源:异步操作不会一直占用线程,系统可以把闲置的线程分配给其他任务,比同步调用更节省系统资源,尤其在高并发场景下优势明显。
- 简化异步代码:以前写异步得靠回调或者
Task.ContinueWith,代码会嵌套得像“千层饼”,可读性极低。Async/Await让异步代码的写法跟同步代码几乎一样,逻辑清晰,维护起来也方便。
2. 为啥标记了Async的方法里必须用Await?
严格来说不是“必须”,但不用的话不仅编译器会警告,代码逻辑也会完全走偏:
- 编译器的设计逻辑:Async关键字是告诉编译器“这个方法包含异步操作,需要生成特殊的状态机来处理”。如果方法里没有Await,那这个方法其实就是同步执行的,Async关键字完全是多余的,编译器会提示你要么添加Await,要么移除Async。
- 任务状态无法同步:如果Async方法里不用Await,方法会立刻返回一个未完成的
Task,调用这个方法的上层代码根本不知道API请求什么时候完成,也拿不到正确的Items数据——相当于你发起了请求,但不等结果就直接告诉上层“我完事了”,这显然不符合需求。 - 异常处理失效:Async方法里的异常如果没有被Await等待,会被封装到返回的
Task中,如果上层代码没有await这个Task,异常就会被默默“吞掉”,很难排查问题。用Await的话,异常会像同步代码一样正常抛出,你可以用try-catch轻松捕获处理。
内容的提问来源于stack exchange,提问作者ammad khan
相关产品推荐
相关产品推荐

