C#中的异步操作

在 C# 中,异步编程主要是通过 async 和 await 关键字实现的,它们使得异步操作变得更加简洁和易于维护。以下是关于异步线程用法的基本介绍,以及如何编写一个异步函数的步骤和示例。在之前的项目中我其实一直在用这些异步的方法,今天有机会正好再重新整理一下。

基本概念

async 关键字

· 用于定义一个异步函数。

· 返回值类型可以是 Task(没有返回值的异步方法)、Task<T>(有返回值的异步方法)或 void(通常用于事件处理)。

await 关键字

· 用于等待一个返回 Task 的异步操作完成。

· 它会暂停当前方法的执行,直到异步操作完成,再继续执行后续代码。

Task 和 Task<T>

· Task 是异步操作的基本单元,表示一个异步任务。

· Task<T> 是一个泛型类型,表示返回值为 T 的异步任务。

异步函数的实现步骤

· 使用 async 标记函数。

· 使用 await 调用异步操作,例如网络请求或耗时任务。

· 异步函数可以返回 Task 或 Task<T>,表示异步任务的结果。

示例代码

  1. 没有返回值的异步方法
cs 复制代码
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("开始异步任务");
        await DoSomethingAsync(); // 调用异步方法
        Console.WriteLine("异步任务完成");
    }

    static async Task DoSomethingAsync()
    {
        Console.WriteLine("开始耗时任务...");
        await Task.Delay(2000); // 模拟异步操作,等待2秒
        Console.WriteLine("耗时任务完成");
    }
}
  1. 有返回值的异步方法
cs 复制代码
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("开始计算任务");
        int result = await CalculateAsync(); // 调用有返回值的异步方法
        Console.WriteLine($"计算结果:{result}");
    }

    static async Task<int> CalculateAsync()
    {
        Console.WriteLine("正在计算...");
        await Task.Delay(1000); // 模拟异步计算
        return 42; // 返回结果
    }
}
  1. 多个异步任务并行执行
cs 复制代码
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("开始多个任务并行");
        Task<int> task1 = Task.Run(() => PerformTask(1, 2000));
        Task<int> task2 = Task.Run(() => PerformTask(2, 1000));

        int[] results = await Task.WhenAll(task1, task2); // 并行等待多个任务完成
        Console.WriteLine($"任务完成,结果:{string.Join(", ", results)}");
    }

    static int PerformTask(int id, int delay)
    {
        Console.WriteLine($"任务{id}开始");
        Task.Delay(delay).Wait(); // 模拟耗时操作
        Console.WriteLine($"任务{id}完成");
        return id * 10;
    }
}
  1. 异步方法中的异常处理
cs 复制代码
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        try
        {
            Console.WriteLine("开始执行任务");
            await ThrowExceptionAsync();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"捕获异常:{ex.Message}");
        }
    }

    static async Task ThrowExceptionAsync()
    {
        await Task.Delay(500);
        throw new InvalidOperationException("这是一个模拟异常");
    }
}
相关推荐
网络点点滴4 分钟前
声明式和函数式 JavaScript 原则
开发语言·前端·javascript
禁默8 分钟前
【学术会议-第五届机械设计与仿真国际学术会议(MDS 2025) 】前端开发:技术与艺术的完美融合
前端·论文·学术
binnnngo13 分钟前
2.体验vue
前端·javascript·vue.js
LCG元14 分钟前
Vue.js组件开发-实现多个文件附件压缩下载
前端·javascript·vue.js
索然无味io18 分钟前
组件框架漏洞
前端·笔记·学习·安全·web安全·网络安全·前端框架
╰つ゛木槿26 分钟前
深入探索 Vue 3 Markdown 编辑器:高级功能与实现
前端·vue.js·编辑器
yqcoder1 小时前
Commander 一款命令行自定义命令依赖
前端·javascript·arcgis·node.js
前端Hardy1 小时前
HTML&CSS :下雪了
前端·javascript·css·html·交互
醉の虾1 小时前
VUE3 使用路由守卫函数实现类型服务器端中间件效果
前端·vue.js·中间件
码上飞扬2 小时前
Vue 3 30天精进之旅:Day 05 - 事件处理
前端·javascript·vue.js