C#中Task详解

在C#中,Task 是一个表示异步操作的类,它允许你编写逻辑,这些逻辑可以在不阻塞调用线程的情况下运行。TaskSystem.Threading.Tasks 命名空间下的一部分,通常与 asyncawait 关键字一起使用来简化异步编程。

以下是 Task 的一些关键概念和用法:

Task 类型

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

创建和启动 Task

  • 使用 Task.RunTask.Factory.StartNew 或者 async void 方法可以启动一个异步任务。
    // 使用 Task.Run 创建并启动一个不返回结果的异步任务
    Task task = Task.Run(() => {
        // 执行一些工作
    });
    
    // 使用 Task<T>.Run 创建并启动一个返回结果的异步任务
    Task<int> taskWithResult = Task.Run(() => {
        // 执行一些工作并返回结果
        return 42;
    });

    等待 Task 完成

  • 使用 await 关键字可以等待一个 Task 完成,这要求使用 async 修饰的方法。
    public async Task DoSomethingAsync()
    {
        // 等待 Task 完成
        await task;
    
        // 等待 Task<T> 完成并获取结果
        int result = await taskWithResult;
        Console.WriteLine(result);
    }

    处理 Task 结果

  • Task<T> 类型提供了 Result 属性来获取异步操作的结果。
    // 等待 Task 完成并获取结果
    int result = taskWithResult.Result;

    错误处理

  • Task 可以处于 Faulted 状态,这表示它由于异常而失败。使用 Try 或 Catch 方法可以处理这些异常。
    if (task.IsFaulted)
    {
        foreach (var exception in task.Exception.InnerExceptions)
        {
            Console.WriteLine(exception.Message);
        }
    }

    取消 Task

  • 使用 CancellationToken 类可以取消一个 Task
    var cts = new CancellationTokenSource();
    Task task = Task.Run(() => {
        // 异步操作
    }, cts.Token);
    
    // 取消任务
    cts.Cancel();

    组合 Task

  • Task.WaitAll 和 Task.WhenAll 可以用于等待多个 Task 完成。
    // 等待多个 Task 完成
    Task.WaitAll(task1, task2);
    
    // 使用 Task.WhenAll 简化代码
    await Task.WhenAll(task1, task2);

    连续 Task

  • 使用 ContinueWith 方法可以创建一个在另一个 Task 完成时开始执行的 Task
    Task continuation = task.ContinueWith((previousTask) => {
        // 之前的 Task 完成后执行
    });

    异常处理

  • 异步方法中,如果 await 的 Task 引发了异常,异常会在 await 调用的地方被抛出。
    public async Task SomeAsyncMethod()
    {
        try
        {
            await SomeOtherAsyncMethodThatThrows();
        }
        catch (Exception ex)
        {
            // 处理异常
        }
    }

    Task 是C#中异步编程的核心组件之一,它提供了丰富的API来处理并发和异步操作。使用 Taskasync/await 可以提高应用程序的响应性和性能,特别是在I/O密集型或高延迟操作中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值