当前位置: 首页 > news >正文

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检查任务是否被取消判断任务是否取消

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

相关文章:

  • 三、tsp学习笔记——屏幕移植
  • UDP与TCP
  • Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)
  • Python常见面试题的详解10
  • STM32 串口转 虚拟串口---实现USB转串口功能
  • Git高级用法
  • MySQL-事务隔离级别
  • FTP自动上传/vue打包自动上传
  • Redis(高阶篇)02章——BigKey
  • 【私人笔记】Web前端
  • 计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
  • python旅游推荐系统+爬虫+可视化(协同过滤算法)
  • ES7 (ES2016) 新特性
  • try learning-git-branching
  • 机器学习_14 随机森林知识点总结
  • 【Python 打造高效文件分类工具】
  • Hbase 2.2.4 伪分布环境与安装
  • Golang GORM系列:GORM分页和排序
  • Docker 安装和配置 Nginx 详细图文教程
  • STM32 低功耗模式
  • 人民日报评论员:党政机关要带头过紧日子
  • 浙江一教师被指殴打并威胁小学生,教育局通报涉事人被行拘
  • 哈马斯与以色列在多哈举行新一轮加沙停火谈判
  • A股三大股指低收:汽车股领涨,大金融走弱,两市成交近1.1万亿元
  • 湖北宜化拟斥资超32亿加价回购“弃子”,布局上游煤炭业务
  • 今年有望投产里程已近3000公里,高铁冲刺谁在“狂飙”?