C# Task异步编程全解析

Task 概述

Task 是 C# 中用于表示异步操作的类,属于 System.Threading.Tasks 命名空间。它是基于任务的异步模式(TAP)的核心组件,用于简化异步编程,替代传统的线程和回调方式。

Task 的创建方式

通过 Task.Run 创建
将同步方法包装为异步任务,默认使用线程池线程执行:

Task task = Task.Run(() => 
{
    Console.WriteLine("Task running in background");
});

通过 Task.Factory.StartNew 创建
提供更多配置选项(如任务调度器、取消令牌等):

Task task = Task.Factory.StartNew(() => 
{
    Console.WriteLine("Task with custom options");
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);

通过构造函数创建
需手动调用 Start 方法启动任务:

Task task = new Task(() => Console.WriteLine("Manual task"));
task.Start();

Task 的返回值

使用 Task<TResult> 表示有返回值的异步操作:

Task<int> task = Task.Run(() => 
{
    return 42; // 返回结果
});
int result = await task; // 获取结果

异步等待 Task

使用 await 等待任务完成(需在 async 方法中):

async Task DoWorkAsync()
{
    await Task.Delay(1000); // 异步延迟
    Console.WriteLine("Work completed");
}

异常处理

Task 异常会存储在 AggregateException 中,可通过 try-catch 捕获:

try
{
    await TaskThatThrowsAsync();
}
catch (Exception ex)
{
    Console.WriteLine($"Exception: {ex.Message}");
}

组合多个 Task

Task.WhenAll
等待所有任务完成:

Task task1 = Task.Delay(1000);
Task task2 = Task.Delay(2000);
await Task.WhenAll(task1, task2);

Task.WhenAny
等待任意一个任务完成:

Task<int> firstTask = await Task.WhenAny(task1, task2);
Console.WriteLine($"First result: {firstTask.Result}");

取消 Task

通过 CancellationToken 实现任务取消:

var cts = new CancellationTokenSource();
Task task = Task.Run(() => 
{
    while (true)
    {
        cts.Token.ThrowIfCancellationRequested();
        Thread.Sleep(100);
    }
}, cts.Token);

cts.CancelAfter(1000); // 1秒后取消

性能注意事项

  • 避免过度创建短期 Task,以减少线程池开销。
  • 使用 ValueTask 优化高频率调用的轻量级异步操作。
  • 避免阻塞 Task(如调用 .Result.Wait()),可能导致死锁。

应用场景

  • IO 密集型操作(如文件读写、网络请求)。
  • CPU 密集型计算(需配合 Task.Run)。
  • 并行处理多个独立任务。

通过合理使用 Task,可以显著提升程序的响应性和资源利用率。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值