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

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

async关键字

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

await关键字

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

Task和Task<T>

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

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

cs 复制代码
using System.Net.Http;
using System.Threading.Tasks;

public class DataFetcher
{
    private readonly HttpClient _httpClient;

    public DataFetcher()
    {
        _httpClient = new HttpClient();
    }

    public async Task<string> GetJsonDataFromApiAsync(string apiUrl)
    {
        using (HttpResponseMessage response = await _httpClient.GetAsync(apiUrl))
        {
            response.EnsureSuccessStatusCode();
            string json = await response.Content.ReadAsStringAsync();
            return json;
        }
    }
}

// 使用示例
public async void GetDataAndProcess()
{
    var fetcher = new DataFetcher();
    
    // 调用异步方法获取数据
    string jsonData = await fetcher.GetJsonDataFromApiAsync("https://api.example.com/data");

    // 数据获取完毕后,进一步处理
    ProcessJsonData(jsonData);
}

在这个例子中:

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

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

相关推荐
格林威1 天前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
J总裁的小芒果1 天前
参数过多-分批传参
c#
典典分享指南1 天前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
Z5998178411 天前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#
zhchyun20081 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(06)
ui·unity·游戏引擎
淡海水1 天前
05-03-栈队列-PriorityQueue-TElement-TPriority-NET6优先队列语义与四叉堆实现
服务器·前端·c#·priorityqueue·clr·telement
Behaviour1 天前
Unity游戏HybridCLR 热更新接入实战
游戏·unity·游戏引擎
leonkay2 天前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
CSDN_RTKLIB2 天前
数据库七大符号表
c#