C#异步编程

参考资料:c#文档-微软

简单介绍c#异步编程

在后端开发中。异步编程允许程序在等待某些耗时操作(如网络请求、文件 I/O、数据库查询等)完成时,继续执行其他任务,从而提高程序的性能和响应能力。与同步编程相比,异步编程可以显著减少资源的浪费,提高系统的吞吐量。

与同步编程相比,异步编程的优势

提高性能:
    资源利用率:异步编程允许程序在等待耗时操作时释放资源(如 CPU),从而提高资源利用率。
    并发处理:多个异步操作可以并发执行,提高系统的吞吐量。

改善用户体验:
    响应性:在用户界面应用程序中,异步编程可以保持界面的响应性,避免因长时间操作导致的界面卡顿。

避免阻塞:
    非阻塞性:异步编程避免了长时间的阻塞操作,使得程序更加高效和灵活。

应用场景:如果需要 I/O 绑定(例如从网络请求数据、访问数据库或读取和写入到文件系统),/还可以使用 CPU 绑定代码(例如执行成本高昂的计算),都可以编写异步代码。

异步编程的核心是 Task 和 Task 类,这两个对象对异步操作建模。 它们受关键字 async 和 await 的支持。 在大多数情况下模型十分简单:

对于 I/O 绑定代码,等待一个在 async 方法中返回 Task 或 Task<T> 的操作。
对于 CPU 绑定代码,等待一个使用 Task.Run 方法在后台线程启动的操作。

async 和 await 关键字

async:修饰一个方法,表示该方法是异步的。
await:用于等待一个异步操作完成,而不阻塞当前线程。

Task 和 Task

Task:表示一个不返回结果的异步操作。
Task<T>:表示一个返回类型为 T 的异步操作。

示例:

  1. 添加异步方法
    我们将添加异步方法来模拟从网络或数据库加载课程数据。为了简化示例,我们将使用 Task.Delay 来模拟网络延迟。

  2. 更新主程序
    我们将更新主程序,使其使用异步方法来加载和显示数据。

更新后的代码

  1. 基类定义
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Gender { get; set; }

    public virtual void DisplayInfo()
    {
        Console.WriteLine("Name: {0}", Name);
        Console.WriteLine("Age: {0}", Age);
        Console.WriteLine("Gender: {0}", Gender);
    }

    // 添加异步方法
    public virtual Task DisplayInfoAsync()
    {
        DisplayInfo();
        return Task.CompletedTask;
    }
}

public class Course
{
    public string CourseName { get; set; }
    public string CourseCode { get; set; }

    public virtual void DisplayInfo()
    {
        Console.WriteLine("Course Name: {0}", CourseName);
        Console.WriteLine("Course Code: {0}", CourseCode);
    }

    // 添加异步方法
    public virtual Task DisplayInfoAsync()
    {
        DisplayInfo();
        return Task.CompletedTask;
    }
}
  1. 继承
public class Student : Person
{
    public string StudentID { get; set; }
    public List<Course> Courses { get; set; } = new List<Course>();

    public override void DisplayInfo()
    {
        base.DisplayInfo();
        Console.WriteLine("Student ID: {0}", StudentID);
        Console.WriteLine("Courses:");
        foreach (var course in Courses)
        {
            course.DisplayInfo();
        }
    }

    public override async Task DisplayInfoAsync()
    {
        await base.DisplayInfoAsync();
        Console.WriteLine("Student ID: {0}", StudentID);
        Console.WriteLine("Courses:");

        foreach (var course in Courses)
        {
            await course.DisplayInfoAsync();
        }
    }

    // 添加异步方法来加载课程数据
    public async Task LoadCoursesAsync(List<Course> courses)
    {
        // 模拟从网络加载课程数据
        await Task.Delay(1000); // 模拟网络延迟
        Courses.AddRange(courses);
    }
}

public class Teacher : Person
{
    public string EmployeeID { get; set; }
    public List<Course> Courses { get; set; } = new List<Course>();

    public override void DisplayInfo()
    {
        base.DisplayInfo();
        Console.WriteLine("Employee ID: {0}", EmployeeID);
        Console.WriteLine("Courses:");
        foreach (var course in Courses)
        {
            course.DisplayInfo();
        }
    }

    public override async Task DisplayInfoAsync()
    {
        await base.DisplayInfoAsync();
        Console.WriteLine("Employee ID: {0}", EmployeeID);
        Console.WriteLine("Courses:");

        foreach (var course in Courses)
        {
            await course.DisplayInfoAsync();
        }
    }

    // 添加异步方法来加载课程数据
    public async Task LoadCoursesAsync(List<Course> courses)
    {
        // 模拟从网络加载课程数据
        await Task.Delay(1000); // 模拟网络延迟
        Courses.AddRange(courses);
    }
}
  1. 主程序
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建课程
        List<Course> courses = new List<Course>
        {
            new Course { CourseName = "Mathematics", CourseCode = "MATH101" },
            new Course { CourseName = "Physics", CourseCode = "PHYS101" }
        };

        // 创建学生
        Student student1 = new Student
        {
            Name = "Alice",
            Age = 20,
            Gender = "Female",
            StudentID = "S001"
        };

        // 创建教师
        Teacher teacher1 = new Teacher
        {
            Name = "Dr. Smith",
            Age = 35,
            Gender = "Male",
            EmployeeID = "T001"
        };

        // 异步加载课程数据
        await student1.LoadCoursesAsync(courses);
        await teacher1.LoadCoursesAsync(new List<Course> { courses[0] });

        // 异步显示学生信息
        Console.WriteLine("Student Information:");
        await student1.DisplayInfoAsync();

        // 异步显示教师信息
        Console.WriteLine("\nTeacher Information:");
        await teacher1.DisplayInfoAsync();
    }
}

异步编程知识点复习:

  1. async 和 await 关键字:
    async 关键字用于标记一个方法为异步方法。异步方法返回 Task 或 Task 类型。
    await 关键字用于等待一个异步操作完成,而不阻塞当前线程。当异步操作完成后,控制权会返回到 await 语句之后的代码。
  2. Task 和 Task:
    Task 表示一个不返回结果的异步操作。
    Task 表示一个返回类型为 T 的异步操作。
  3. Task.Delay:
    Task.Delay 方法用于模拟异步延迟,常用于模拟网络请求或文件读写等耗时操作。
  4. 异步方法的返回值:
    如果异步方法不返回任何值,应返回 Task。
    如果异步方法返回一个值,应返回 Task,其中 T 是返回值的类型。
  5. 异步方法的调用:
    调用异步方法时,使用 await 关键字等待其完成。
    如果不使用 await,异步方法会立即返回一个 Task 对象,不会等待操作完成。

通过这些异步方法,我们的应用程序可以在执行长时间操作时保持响应性,从而提高用户体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值