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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20379.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高子昂医编---23岁,医疗编上岸,正式开启养老生活

作为一个只想毕业后就找个稳定工作躺平一生的普通人&#xff0c;直接放弃加入考研考公大军&#xff0c;加入了竞争稍微小一点的考编大军&#xff01;毕业那年在学校辛苦奋斗四个多月&#xff0c;直接一战上岸&#xff01;成为了一名有编制的医务工作者&#xff01;现在在我们家…

【Linux系统】—— 调试器 gdb/cgdb的使用

【Linux系统】—— 调试器 gdb/cgdb的使用 1 前置准备2 快速认识 gdb3 cgdb/gdb 的使用3.1 简单认识 cgdb3.2 打断点 / 删断点3.3 逐过程 / 逐语句3.4 查看变量3.5 快速跳转 4 cgdb/gdb 调试技巧4.1 watch4.2 「set var」确定问题原因4.3 条件断点 5 概念理解6 gdb/cgdb 指令一…

llama.cpp部署 DeepSeek-R1 模型

一、llama.cpp 介绍 使用纯 C/C推理 Meta 的LLaMA模型&#xff08;及其他模型&#xff09;。主要目标llama.cpp是在各种硬件&#xff08;本地和云端&#xff09;上以最少的设置和最先进的性能实现 LLM 推理。纯 C/C 实现&#xff0c;无任何依赖项Apple 芯片是一流的——通过 A…

【Vue3】Vue 3 中列表排序的优化技巧

本文将深入探讨 Vue 3 中列表排序的优化技巧&#xff0c;帮助提升应用的性能和响应速度。 1. 避免不必要的排序 按需排序 在实际应用中&#xff0c;并非每次数据更新都需要进行排序。例如&#xff0c;当列表数据仅在特定条件下需要排序时&#xff0c;可通过条件判断来避免不…

HaProxy源码安装(Rocky8)

haproxy具有高性能、高可用性、灵活的负载均衡策略和强大的将恐和日志功能&#xff0c;是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件&#xff0c;是一款具 备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&a…

调用openssl实现加解密算法

由于工作中涉及到加解密&#xff0c;包括Hash&#xff08;SHA256&#xff09;算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法&#xff0c;笔者通过查询发现openssl库以上算法都支持&#xff0c;索性借助openssl库实现上述5类算法。笔者用的op…

1-13 tortoiseGit忽略文件与文件夹

前言&#xff1a; 基于本人对小乌龟操作的学习和思考&#xff0c;仅供参考 1-1 忽略问价和文件夹 有时候我们的一些文件是不想要提交&#xff0c;那么我们可以使用stash的方式给这个文件添加忽略&#xff0c;那么我们现在来给这个实际操作创建一个操作的环境。 右键选中添加到忽…

✨2.快速了解HTML5的标签类型

✨✨HTML5 的标签类型丰富多样&#xff0c;每种类型都有其独特的功能和用途&#xff0c;以下是一些常见的 HTML5 标签类型介绍&#xff1a; &#x1f98b;结构标签 &#x1faad;<html>&#xff1a;它是 HTML 文档的根标签&#xff0c;所有其他标签都包含在这个标签内&am…

PostgreSQL 的崛起与无服务器数据库的新时代

根据 2023 年 Stack Overflow 开发人员调查 &#xff0c;PostgreSQL 超越 MySQL 成为最受开发人员推崇和期望的数据库系统&#xff0c;这是一个重要的里程碑。这一转变反映了开发人员社区对 PostgreSQL 强大的功能集、可靠性和可扩展性的日益认同。 这种不断变化的格局激发了数…

Redis(高阶篇)03章——缓存双写一致性之更新策略探讨

一、反馈回来的面试题 一图你只要用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性的问题双写一致性&#xff0c;你先动缓存redis还是数据库mysql哪一个&#x…

【机器学习监督学习】:从原理到实践,探索算法奥秘,揭示数据标注、模型训练与预测的全过程,助力人工智能技术应用与发展

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏:机器学习专栏 目录 线性回归&#xff08;Linear Regression&#xff09; 基本概念 数学模型 优缺点 利用Python实现线性回归 逻辑回归&#xff08;Logistic Regression&#xff09; 3.2. 数学模型 优缺点 …

数据结构_前言

本次我们将进入一个新的阶段啦~ 要注意哦&#xff1a; 在学数据结构之前&#xff0c;我们要先掌握c语言中所学的指针、结构体、内存的存储这几部分&#xff0c;如果还没太掌握的话&#xff0c;那记得去复习回顾一下噢。 下面我们就一起进入数据结构的学习吧&#xff01; 知识…

VirtualBox 中使用 桥接网卡 并设置 MAC 地址

在 VirtualBox 中使用 桥接网卡 并设置 MAC 地址&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;设置桥接网卡 打开 VirtualBox&#xff0c;选择你的虚拟机&#xff0c;点击 “设置” (Settings)。进入 “网络” (Network) 选项卡。在 “适配器 1” (Adapt…

【Mysql】索引

【Mysql】索引 一、索引的简介二、索引结构2.1 Hash2.2 二叉搜索树2.3 B树2.4 B树 三、索引分类3.1 主键索引3.2 普通索引3.3 唯一索引3.4 全文索引3.5 聚集索引3.6 非聚集索引3.7 索引覆盖 四、使用索引4.1 自动创建索引4.2 手动创建索引4.2.1 主键索引4.2.2 唯一索引4.2.3 普…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…

1、Window Android 13模拟器 将编译的映像文件导入Android Studio

1、环境准备 编译环境&#xff1a;Ubuntu-18.04.5编译版本&#xff1a;android13-release下载地址&#xff1a;清华大学开源软件镜像站AOSP # 下载repo # 同步代码&#xff1a;repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…

UE5 Niagara 粒子远处闪烁解决

在UE5.2中使用Niagara粒子系统制作水特效时&#xff0c;远处出现粒子闪烁的问题&#xff0c;通常由渲染精度、深度冲突或LOD设置引起 .效果如下&#xff1a; 处理深度缓冲冲突&#xff08;Z-Fighting&#xff09; 问题原因&#xff1a;粒子与场景几何体深度值重叠导致闪烁。 …

机器学习入门实战 4 - 基本模型

&#x1f4cc; 机器学习基本模型项目实战&#xff1a;预测泰坦尼克号乘客的生存概率 &#x1f6a2; 项目背景 1912 年 4 月 15 日&#xff0c;泰坦尼克号在处女航中撞上冰山沉没&#xff0c;船上 2224 名乘客和船员中&#xff0c;仅有约 710 人生还。 哪些因素决定了生还几率&…

电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案

作者背景 拥有8年乙方项目经理经验、8年甲方信息化管理经验&#xff0c;主导过12个Odoo制造业项目落地&#xff0c;服务客户涵盖消费电子、汽车电子、工业设备等领域。本文基于华东某电子企业&#xff08;以下简称"A公司"&#xff09;的实战案例&#xff0c;解析行业…

Python - 爬虫利器 - BeautifulSoup4常用 API

文章目录 前言BeautifulSoup4 简介主要特点&#xff1a;安装方式: 常用 API1. 创建 BeautifulSoup 对象2. 查找标签find(): 返回匹配的第一个元素find_all(): 返回所有匹配的元素列表select_one() & select(): CSS 选择器 3. 访问标签内容text 属性: 获取标签内纯文本get_t…