MST
星途 面试题库

面试题:C#中async/await的基本工作原理

请简要阐述C#中async/await关键字组合的基本工作原理,以及它们如何实现异步编程。举例说明在一个简单的I/O操作中如何运用async/await。
26.5万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. async/await 基本工作原理

  • async关键字用于标记一个方法为异步方法。当一个方法被标记为async,它会在遇到await关键字时暂停执行,将控制权返回给调用者,同时方法的状态会被保存。
  • await关键字只能在async方法内部使用。它用于等待一个TaskTask<TResult>完成。当await一个Task时,当前的异步方法会暂停执行,直到被等待的Task完成。此时,await会返回Task的结果(如果是Task<TResult>),然后异步方法从暂停的地方继续执行。

2. 如何实现异步编程

通过async/await,可以像编写同步代码一样编写异步代码,避免了复杂的回调嵌套(回调地狱)。async方法返回TaskTask<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等待StreamReaderReadToEndAsync方法完成,该方法是一个异步I/O操作。Main方法同样标记为async,可以使用await等待ReadFileAsync的结果,整个过程以异步方式执行,不会阻塞主线程。