面试题答案
一键面试1. async/await 基本工作原理
async
关键字用于标记一个方法为异步方法。当一个方法被标记为async
,它会在遇到await
关键字时暂停执行,将控制权返回给调用者,同时方法的状态会被保存。await
关键字只能在async
方法内部使用。它用于等待一个Task
或Task<TResult>
完成。当await
一个Task
时,当前的异步方法会暂停执行,直到被等待的Task
完成。此时,await
会返回Task
的结果(如果是Task<TResult>
),然后异步方法从暂停的地方继续执行。
2. 如何实现异步编程
通过async/await
,可以像编写同步代码一样编写异步代码,避免了复杂的回调嵌套(回调地狱)。async
方法返回Task
或Task<TResult>
,使得调用者可以方便地处理异步操作的结果。同时,await
会自动处理线程上下文的切换,在Task
完成后,代码会在合适的上下文(例如UI线程)中继续执行。
3. 简单I/O操作示例
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("开始读取文件...");
string content = await ReadFileAsync("example.txt");
Console.WriteLine("文件内容: " + content);
}
static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
return await reader.ReadToEndAsync();
}
}
}
在上述示例中,ReadFileAsync
方法被标记为async
,在内部使用await
等待StreamReader
的ReadToEndAsync
方法完成,该方法是一个异步I/O操作。Main
方法同样标记为async
,可以使用await
等待ReadFileAsync
的结果,整个过程以异步方式执行,不会阻塞主线程。