C#异步/多线程编程中Task对象强大的功能介绍。

在 C# 的异步编程中,Task 是一个非常重要的类,它表示一个异步操作。Task 类提供了许多方法,用于管理、控制和组合异步操作。以下是 Task 类中一些常用方法的详细讲解及其功能。


1. Task.Run

  • 功能:将指定的代码块调度到线程池中异步执行。

  • 用途:用于在后台线程中执行 CPU 密集型操作。

  • 示例

    csharp

    Task.Run(() => 
    {
        Console.WriteLine("This runs on a background thread.");
    });


2. Task.Delay

  • 功能:创建一个在指定时间后完成的 Task

  • 用途:用于实现异步等待,比如模拟延迟或定时任务。

  • 示例

    csharp

    await Task.Delay(1000); // 等待 1 秒
    Console.WriteLine("1 second has passed.");


3. Task.FromResult

  • 功能:创建一个已经完成并返回指定结果的 Task<TResult>

  • 用途:用于同步方法中返回一个已完成的任务。

  • 示例

    csharp

    Task<int> task = Task.FromResult(42);
    Console.WriteLine(task.Result); // 输出: 42


4. Task.Wait

  • 功能:阻塞当前线程,直到任务完成。

  • 用途:用于同步等待任务完成(不推荐在异步代码中使用,可能导致死锁)。

  • 示例

    csharp

    Task task = Task.Run(() => Console.WriteLine("Task running."));
    task.Wait(); // 阻塞,直到任务完成


5. Task.WaitAll

  • 功能:阻塞当前线程,直到所有提供的任务完成。

  • 用途:用于同步等待多个任务完成。

  • 示例

    csharp

    Task task1 = Task.Run(() => Console.WriteLine("Task 1"));
    Task task2 = Task.Run(() => Console.WriteLine("Task 2"));
    Task.WaitAll(task1, task2); // 等待所有任务完成


6. Task.WaitAny

  • 功能:阻塞当前线程,直到任何一个提供的任务完成。

  • 用途:用于同步等待多个任务中的任意一个完成。

  • 示例

    csharp

    Task task1 = Task.Run(() => Thread.Sleep(1000));
    Task task2 = Task.Run(() => Thread.Sleep(500));
    int completedTaskIndex = Task.WaitAny(task1, task2); // 返回第一个完成的任务的索引
    Console.WriteLine($"Task {completedTaskIndex + 1} completed first.");


7. Task.WhenAll

  • 功能:创建一个任务,该任务在所有提供的任务完成后完成。

  • 用途:用于异步等待多个任务完成。

  • 示例

    csharp

    Task task1 = Task.Run(() => Console.WriteLine("Task 1"));
    Task task2 = Task.Run(() => Console.WriteLine("Task 2"));
    await Task.WhenAll(task1, task2); // 异步等待所有任务完成


8. Task.WhenAny

  • 功能:创建一个任务,该任务在任何一个提供的任务完成后完成。

  • 用途:用于异步等待多个任务中的任意一个完成。

  • 示例

    csharp

    Task task1 = Task.Run(() => Thread.Sleep(1000));
    Task task2 = Task.Run(() => Thread.Sleep(500));
    Task completedTask = await Task.WhenAny(task1, task2); // 返回第一个完成的任务
    Console.WriteLine("A task has completed.");


9. Task.ContinueWith

  • 功能:创建一个在任务完成后执行的任务。

  • 用途:用于任务完成后执行额外的逻辑。

  • 示例

    csharp

    Task task = Task.Run(() => Console.WriteLine("Initial task."));
    task.ContinueWith(t => Console.WriteLine("Continuation task."));


10. Task.ConfigureAwait

  • 功能:配置任务的等待行为,决定是否回到原始上下文(如 UI 线程)。

  • 用途:用于优化异步代码的性能,避免不必要的上下文切换。

  • 示例

    csharp

    await Task.Run(() => Console.WriteLine("Background task."))
              .ConfigureAwait(false); // 不回到原始上下文


11. Task.Start

  • 功能:启动一个任务。

  • 用途:用于手动启动任务(通常与 Task 构造函数一起使用)。

  • 示例

    csharp

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


12. Task.RunSynchronously

  • 功能:在当前线程上同步运行任务。

  • 用途:用于强制任务在当前线程上执行。

  • 示例

    csharp

    Task task = new Task(() => Console.WriteLine("Running synchronously."));
    task.RunSynchronously();


13. Task.Result

  • 功能:获取任务的返回值(阻塞当前线程,直到任务完成)。

  • 用途:用于同步获取任务的结果(不推荐在异步代码中使用,可能导致死锁)。

  • 示例

    csharp

    Task<int> task = Task.Run(() => 42);
    int result = task.Result; // 阻塞,直到任务完成
    Console.WriteLine(result); // 输出: 42


14. Task.IsCompleted

  • 功能:检查任务是否已完成。

  • 用途:用于判断任务的状态。

  • 示例

    csharp

    Task task = Task.Run(() => Thread.Sleep(1000));
    if (task.IsCompleted)
    {
        Console.WriteLine("Task is completed.");
    }


15. Task.IsFaulted 和 Task.Exception

  • 功能

    • IsFaulted:检查任务是否因异常而失败。

    • Exception:获取任务抛出的异常。

  • 用途:用于处理任务中的异常。

  • 示例

    csharp

    Task task = Task.Run(() => throw new Exception("Task failed."));
    if (task.IsFaulted)
    {
        Console.WriteLine($"Task failed: {task.Exception.Message}");
    }


16. Task.IsCanceled

  • 功能:检查任务是否被取消。

  • 用途:用于判断任务是否因取消而结束。

  • 示例

    csharp

    CancellationTokenSource cts = new CancellationTokenSource();
    Task task = Task.Run(() => 
    {
        cts.Token.ThrowIfCancellationRequested();
    }, cts.Token);
    
    cts.Cancel();
    if (task.IsCanceled)
    {
        Console.WriteLine("Task was canceled.");
    }


总结

方法名功能描述适用场景
Task.Run在后台线程中执行代码CPU 密集型操作
Task.Delay创建一个延迟任务异步等待
Task.FromResult创建一个已完成的任务同步方法中返回任务
Task.Wait阻塞当前线程,直到任务完成同步等待任务完成
Task.WaitAll阻塞当前线程,直到所有任务完成同步等待多个任务完成
Task.WaitAny阻塞当前线程,直到任意一个任务完成同步等待多个任务中的任意一个完成
Task.WhenAll异步等待所有任务完成异步等待多个任务完成
Task.WhenAny异步等待任意一个任务完成异步等待多个任务中的任意一个完成
Task.ContinueWith在任务完成后执行额外逻辑任务链式操作
Task.ConfigureAwait配置任务的等待行为优化异步代码性能
Task.Start启动任务手动启动任务
Task.RunSynchronously在当前线程上同步运行任务强制任务在当前线程执行
Task.Result获取任务的返回值同步获取任务结果
Task.IsCompleted检查任务是否完成判断任务状态
Task.IsFaulted检查任务是否因异常失败处理任务异常
Task.IsCanceled检查任务是否被取消判断任务是否取消

通过合理使用这些方法,你可以更好地管理和控制异步任务,编写高效、可靠的异步代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值