• C# 系统学习(异步编程)


    在C#中,异步编程是一种优化程序性能的关键技术,特别是在处理I/O密集型操作(如网络请求、数据库查询、文件读写等)时,能够有效避免由于长时间等待而导致的线程阻塞,从而提高应用的响应速度和资源利用率。async 和 await 是C# 5.0及更高版本引入的关键字,它们极大地简化了异步编程模型。

    async关键字

    • 当你在方法声明前面加上 async 关键字时,标识该方法是一个异步方法。异步方法通常会返回 Task 或 Task 类型,表明该方法包含一个异步操作,并且可能不会立即返回结果。
    1. public async Task<string> FetchDataAsync()
    2. {
    3. // ...
    4. }

    await关键字

    • 在异步方法内部,你可以使用 await 关键字来等待异步操作的完成。当遇到 await 表达式时,控制权将暂时交回给调用方,而不会阻塞当前线程。一旦异步操作完成,控制权将重新回到 await 后面的语句继续执行。
    1. public async Task ProcessDataAsync()
    2. {
    3. string data = await FetchDataAsync();
    4. // 这一行将在FetchDataAsync完成后执行
    5. Console.WriteLine(data);
    6. }

    Task和Task

    • System.Threading.Tasks.Task 和 System.Threading.Tasks.Task 是C#异步编程中用于表示异步操作结果的类型。
      • Task 代表不返回具体值的异步操作。
      • Task 代表完成后会有一个特定类型T结果的异步操作。

    例如,假设我们有一个方法用于从Web API获取数据:

    1. using System.Net.Http;
    2. using System.Threading.Tasks;
    3. public class DataFetcher
    4. {
    5. private readonly HttpClient _httpClient;
    6. public DataFetcher()
    7. {
    8. _httpClient = new HttpClient();
    9. }
    10. public async Task<string> GetJsonDataFromApiAsync(string apiUrl)
    11. {
    12. using (HttpResponseMessage response = await _httpClient.GetAsync(apiUrl))
    13. {
    14. response.EnsureSuccessStatusCode();
    15. string json = await response.Content.ReadAsStringAsync();
    16. return json;
    17. }
    18. }
    19. }
    20. // 使用示例
    21. public async void GetDataAndProcess()
    22. {
    23. var fetcher = new DataFetcher();
    24. // 调用异步方法获取数据
    25. string jsonData = await fetcher.GetJsonDataFromApiAsync("https://api.example.com/data");
    26. // 数据获取完毕后,进一步处理
    27. ProcessJsonData(jsonData);
    28. }

    在这个例子中:

    1. GetJsonDataFromApiAsync 方法被标记为异步方法,因为它执行HTTP GET请求,这是一个典型的I/O操作,适合异步处理。
    2. 方法内部,await _httpClient.GetAsync(apiUrl) 遇到第一个异步操作,此时控制权返回给调用栈,主线程可以继续执行其他任务。
    3. 当HTTP响应可用时,.ReadAsStringAsync() 方法也被异步等待,最后返回JSON字符串。
    4. 在主程序中,通过 await fetcher.GetJsonDataFromApiAsync(...) 我们等待数据加载完成,并在完成后处理数据。

    通过这种方式,即使在网络请求或其他外部资源访问过程中可能会耗时较长,应用程序仍然能够保持响应性和流畅性,因为CPU时间片并未被长时间占用的等待所浪费。这就是异步编程在提升应用程序性能方面的关键作用。

  • 相关阅读:
    【操作系统】调度算法的评价指标和三种调度算法
    (二十二)Flask之上下文管理第三篇【收尾—讲一讲g】
    【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术
    Vue项目的记录(五)
    基于 Java 解释一下硬编码和非硬编码?
    【正点原子STM32连载】第十一章 STM32时钟系统 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    软件测试/测试开发/人工智能丨视觉与图像识别自动化测试
    [WinError 193] %1 不是有效的 Win32 应用程序
    Python高校学生档案管理系统毕业设计源码071528
    计算机网络_实验5_集线器与交换机对比
  • 原文地址:https://blog.csdn.net/qq_57101277/article/details/137213304