面试题答案
一键面试-
使用
async/await
实现HTTP请求获取网页内容:- 首先,需要引入
System.Net.Http
命名空间,它提供了用于处理HTTP请求的类。 - 示例代码如下:
using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { using (HttpClient client = new HttpClient()) { try { string url = "https://example.com";//替换为实际网址 // 使用`await`等待`GetStringAsync`操作完成,这是一个异步操作 string content = await client.GetStringAsync(url); Console.WriteLine(content); } catch (HttpRequestException e) { Console.WriteLine($"请求出错: {e.Message}"); } } } }
- 在上述代码中:
async
关键字用于标记一个异步方法,Main
方法被标记为async
,表示它是一个异步操作的入口。await
关键字只能在async
方法内部使用。client.GetStringAsync(url)
是一个返回Task<string>
的异步方法,await
会暂停当前方法的执行,直到这个Task<string>
完成,然后获取其结果(即网页内容字符串)。
- 首先,需要引入
-
与协程概念类比
async/await
的角色:- 在协程概念中,协程允许程序在执行过程中暂停和恢复执行。
async/await
在C#中扮演类似的角色:async
标记的方法类似于协程的定义,它表明这个方法可以包含异步操作。await
类似于协程中的暂停点。当执行到await
时,当前的异步方法暂停执行,控制权返回给调用者,而其他代码(比如主线程中的其他任务)可以继续执行。当await
等待的异步操作完成后,异步方法从暂停点恢复执行,继续处理后续代码。所以async/await
组合提供了一种类似协程的异步编程模型,使得异步代码可以像同步代码一样编写和阅读,提高了代码的可读性和可维护性。