C# 多线程八 任务Task的简单理解与运用二

article/2025/11/8 13:34:07

目录

一.Task

1.AsyncState   

2.CompletedTask     

3.CreationOptions     

4.CurrentId  

5.Exception   

6.Factory     

7.Id   

8.IsCanceled     

9.IsCompleted   

10.IsFaulted     

11.Status  

二.Task<TResult>

1.Result


上篇:

C# 多线程七 任务Task的简单理解与运用一

接着上篇,我们这篇主要说一下Task的属性

前言:Task的属性说明基本都是从Task.Exception 属性 (System.Threading.Tasks) | Microsoft Learn拷贝下来的,只是加了自己的理解和测试代码以及打印来供大家更好的理解。

一.Task

1.AsyncState   

获取在创建 Task 时提供的状态对象,如果未提供,则为 null。

自己的测试:

1.Task task=new Task(); task.Start();调用模式下

获取以下几种构造方法传入的state的值

        public Task(Action<object> action, object state);

        public Task(Action<object> action, object state, CancellationToken cancellationToken);
 
        public Task(Action<object> action, object state, TaskCreationOptions creationOptions);

        public Task(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions);

测试代码:

using(CancellationTokenSource source = new CancellationTokenSource()) {Task task = new Task((obj) => {Console.WriteLine("开始执行task任务:" + obj);}, (object)"xxx", source.Token, TaskCreationOptions.None);Console.WriteLine(task.AsyncState);task.Start();}

打印:

2.Task.Factory.StartNew();调用模式下

获取以下方法传入的state的值

       public Task StartNew(Action<object> action, object state, CancellationToken cancellationToken);

        public Task StartNew(Action<object> action, object state, TaskCreationOptions creationOptions);

        public Task StartNew(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler);

        public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state);

        public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state, CancellationToken cancellationToken);

        public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state, TaskCreationOptions creationOptions);

        public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler);

        public Task StartNew(Action<object> action, object state);

测试代码:

using(CancellationTokenSource source = new CancellationTokenSource()) {Task task1 = Task.Factory.StartNew((obj) => {Console.WriteLine("开始执行task1任务:" + obj);}, (object)"zzz", source.Token);Console.WriteLine(task1.AsyncState);}

打印:

2.CompletedTask     

获取一个已成功完成的任务。
这个属性 我整了好久才懂 首先CompletedTask取到的不是你当前完成后的Task他会给你创建一个独立Task另外使用CompletedTask和await async关键字依然是单线程

两个例子

1.CompletedTask取到的不是你当前完成后的Task

代码:

using(CancellationTokenSource source = new CancellationTokenSource()) {for(int i = 0; i < 100; i++) {Task.Run(() => {Console.WriteLine($"开始执行task{i}任务 taskID :{Task.CurrentId}");});}Thread.Sleep(1000);Console.WriteLine("获取一个完成任务ID:" + Task.CompletedTask.Id);}

打印:

 2.CompletedTask和await async关键字依然是单线程

 代码:

static async void  DoSomething() {Task task =  Task.Run(() => {Console.WriteLine("开始执行task");});await task;Console.WriteLine("DoSomething 获取当前执行线程" + Thread.CurrentThread.ManagedThreadId);}static async void DoSomething1() {await Task.CompletedTask;Console.WriteLine("DoSomething1 获取当前执行线程" + Thread.CurrentThread.ManagedThreadId);}static void Main(string[] args) {DoSomething();DoSomething1();Console.WriteLine("Main 获取当前执行线程" + Thread.CurrentThread.ManagedThreadId);Console.ReadLine();
}

打印:

3.CreationOptions     

获取用于创建此任务的 TaskCreationOptions。
和AsyncState类似只不过一个是获取object state 一个是获取 TaskCreationOptions

4.CurrentId  

返回当前正在执行 Task 的 ID。
在当前task执行中调用 外部调用使用Id

 代码:

Task task1 = Task.Factory.StartNew((obj) => {Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);

5.Exception   

获取 AggregateException导致 的 提前结束的 Task。 如果 Task 成功完成或尚未引发任何异常,这将返回 null。

代码:

using(CancellationTokenSource source = new CancellationTokenSource()) {Task task1 = new Task((obj) => {int[] num = new int[2];Task task = Task.Factory.StartNew(() => {Console.WriteLine("开始执行task1子任务task:" + Task.CurrentId + num[3]);}, source.Token, TaskCreationOptions.AttachedToParent, TaskScheduler.Current);Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);task1.Start();Thread.Sleep(3000);Console.WriteLine(" 未经处理异常  : " + task1.Exception);Console.WriteLine(" 由于未经处理异常的原因  : " + task1.IsFaulted);}

打印:

6.Factory     

提供对用于创建和配置 Task 和 Task<TResult> 实例的工厂方法的访问。 

7.Id   

获取此 Task 实例的 ID。
在Task外部使用

代码:

Task task1 = Task.Factory.StartNew((obj) => {Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);Console.WriteLine("task1ID: " + task1.Id);

8.IsCanceled     

获取此 Task 实例是否由于被取消的原因而已完成执行。

代码:

 using(CancellationTokenSource source = new CancellationTokenSource()) {Task task1 = Task.Factory.StartNew((obj) => {Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);source.Cancel();//Thread.Sleep(1000);Console.WriteLine(" 是否被取消结束的任务  : " + task1.IsCanceled);}

打印:

此时明明已经取消了为什么会打印false呢?因为Task还没开始执行 就去检测了
修改: 

using(CancellationTokenSource source = new CancellationTokenSource()) {Task task1 = Task.Factory.StartNew((obj) => {Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);source.Cancel();Thread.Sleep(1000);Console.WriteLine(" 是否被取消结束的任务  : " + task1.IsCanceled);}

打印:

9.IsCompleted   

  获取一个值,它表示是否已完成任务。

代码:

using(CancellationTokenSource source = new CancellationTokenSource()) {Task task1 = Task.Factory.StartNew((obj) => {Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);source.Cancel();Thread.Sleep(1000);Console.WriteLine(" 是否被取消结束的任务  : " + task1.IsCanceled);Console.WriteLine(" 是否已经完成任务  : " + task1.IsCompleted);}

 打印:

由此可见 就算是取消了任务的执行 IsCompleted也会返回true表示任务完成

10.IsFaulted     

获取 Task 是否由于未经处理异常的原因而完成。
Exception中已有测试 不再赘述

11.Status  

   获取此任务的 TaskStatus。

代码:

        using(CancellationTokenSource source = new CancellationTokenSource()) {Task task1 = new Task((obj) => {Console.WriteLine("开始执行task1任务:" + obj + " ID :" + Task.CurrentId);}, (object)"zzz", source.Token);Console.WriteLine("task1任务状态1:" + task1.Status);task1.Start();Thread.Sleep(3000);Console.WriteLine("task1任务状态2:" + task1.Status);}

打印:

二.Task<TResult>

1.Result

获取此 Task<TResult> 的结果值。
会阻塞线程

代码:

Task<string> task = Task.Factory.StartNew<string>(() => {Thread.Sleep(1000);Console.WriteLine("开始执行task");return "返回值";});Console.WriteLine(task.Result);Console.WriteLine("执行主线程");Console.ReadLine();

 打印:

Task的属性到此就写完了,下篇将接着写Task的方法。

如果有不对的地方希望能指出来 感激不尽。

另外,不熟悉的代码一定要写一下加深记忆 只用看的记不了太久。


http://chatgpt.dhexx.cn/article/bqcfAPsf.shtml

相关文章

多任务学习(一)

多任务学习 单任务学习 样本之间没有关联性。 缺点&#xff1a;训练出来的模型不具有泛化性&#xff1b;不共享信息使得学习能力下降。 多任务学习 多任务学习的构建原则 建模任务之间的相关性同时对多个任务的模型参数进行联合学习&#xff0c;挖掘其中的共享信息&#…

多任务学习-Multitask Learning概述

2020-02-22 09:59:48 1、单任务学习VS多任务学习 单任务学习&#xff1a;一次只学习一个任务&#xff08;task&#xff09;&#xff0c;大部分的机器学习任务都属于单任务学习。 多任务学习&#xff1a;把多个相关&#xff08;related&#xff09;的任务放在一起学习&#x…

深度学习之----多任务学习

介绍 在机器学习&#xff08;ML&#xff09;中&#xff0c;通常的关注点是对特定度量进行优化&#xff0c;度量有很多种&#xff0c;例如特定基准或商业 KPI 的分数。为了做到这一点&#xff0c;我们通常训练一个模型或模型组合来执行目标任务。然后&#xff0c;我们微调这些模…

深度学习中的多任务学习介绍

在2017年有一篇关于在深度神经网络中多任务学习概述的论文&#xff1a;《An Overview of Multi-Task Learning in Deep Neural Networks》&#xff0c;论文链接为&#xff1a;https://arxiv.org/pdf/1706.05098.pdf&#xff0c;它介绍了在深度学习中多任务学习(Multi-task Lear…

C# 多线程七 任务Task的简单理解与运用一

目录 一.Task 二.Task中的全局队列和本地队列 三.TaskCreationOptions 枚举 四.CancellationTokenSource/CancellationToken 1.延时取消线程 2.立即取消&#xff1a; 五.Task的三种调用方式 为了防止大家被标题误导 写在前面&#xff1a; Task并不是线程 Task的执行需要…

整理学习之多任务学习

如果有n个任务&#xff08;传统的深度学习方法旨在使用一种特定模型仅解决一项任务&#xff09;&#xff0c;而这n个任务或它们的一个子集彼此相关但不完全相同&#xff0c;则称为多任务学习&#xff08;MTL&#xff09; 通过使用所有n个任务中包含的知识&#xff0c;将有助于改…

多任务学习优化总结 Multi-task learning(附代码)

目录 一、多重梯度下降multiple gradient descent algorithm (MGDA) 二、Gradient Normalization (GradNorm) 三、Uncertainty 多任务学习的优势不用说了&#xff0c;主要是可以合并模型&#xff0c;减小模型体积&#xff0c;只用一次推理也可以加快速度。对于任务表现的提升…

经验 | 训练多任务学习(Multi-task Learning)方法总结

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 转载于&#xff1a;知乎Anticoder https://zhuanlan.zhihu.com/p/59413549 背景&#xff1a;只专注于单个模型可能会忽略一些相关任务中可能提升目标任务的潜在信息&…

多任务学习(Multi-Task Learning)

转自&#xff1a;https://www.cnblogs.com/zeze/p/8244357.html 1. 前言 多任务学习&#xff08;Multi-task learning&#xff09;是和单任务学习&#xff08;single-task learning&#xff09;相对的一种机器学习方法。在机器学习领域&#xff0c;标准的算法理论是一次学习一…

多任务学习 | YOLOP,一个网络同时完成三大任务

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 paper: https://arxiv.org/abs/2108.11250 code: https://github.com/hustvl/YOLOP 计算机视觉研究院专栏 作者&#xff1a;Edison_G YOLOP: You Onl…

多任务学习概述

文章目录 前言1 文章信息2 背景、目的、结论2.1 背景2.1.1 多任务的类型分类2.1.1.1 相关任务的分类2.1.1.2 将输入变输出的逆多任务学习2.1.1.3 对抗性多任务学习2.1.1.4 辅助任务提供注意力特征的多任务学习2.1.1.5 附加预测性辅助任务的多任务学习 3 内容与讨论3.1 多任务学…

多任务学习(Multi-task Learning)方法总结

多任务学习&#xff08;multi task learning&#xff09;简称为MTL。简单来说有多个目标函数loss同时学习的就算多任务学习。多任务既可以每个任务都搞一个模型来学&#xff0c;也可以一个模型多任务学习来一次全搞定的。 作者丨Anticoder知乎 链接丨https://zhuanlan.zhihu.co…

浅谈多任务学习

目录 一、前言及定义 二、多任务学习&#xff08;MTL&#xff09;的两种方法 2.1 参数的硬共享机制&#xff08;hard parameter sharing&#xff09; 2.2 参数的软共享机制&#xff08;soft parameter sharing&#xff09; 三、多任务学习模型 3.1 MT-DNN 3.2 ERNIE 2.0…

多任务学习

一、单任务学习和多任务学习 多任务学习是和单任务学习对应的一种机器学习方法。 单任务学习 在单任务学习中&#xff0c;认为不同任务之间是不具有关联性的。因此&#xff0c;每个模型的参数都是独立训练的。这样的学习方法有两个缺陷&#xff1a; 由于每个任务中的训练数据有…

多任务学习 (Multitask Learning) 汇总

1 前言 多任务学习&#xff08;Multi-task learning&#xff09;是和单任务学习&#xff08;single-task learning&#xff09;相对的一种机器学习方法。在机器学习领域&#xff0c;标准的算法理论是一次学习一个任务&#xff0c;也就是系统的输出为实数的情况。复杂的学习问题…

【GANs学习笔记】(十八)LAPGAN、ProGAN、SRGAN

完整笔记&#xff1a;http://www.gwylab.com/note-gans.html ——————————————————————— 4. LapGAN 4.1 LapGAN基本思路 如果我们希望生成高分辨率图像&#xff0c;还有一种GANs可以考虑&#xff0c;那就是LapGAN。LapGAN与StackGAN有着非常类似的思路&…

GAN网络

目录 GAN生成网络G&#xff08;Generative&#xff09;对抗网络D&#xff08;Discriminative&#xff09;两分布之间差异性评价KL散度JS散度 损失函数一次代码实验 WGANWGAN-GPConditional GAN GAN 生成式对抗网络&#xff08;GAN, Generative Adversarial Networks&#xff0…

基于pytorch的SRGAN实现(全网最细!!!)

基于pytorch的SRGAN实现 前言SRGAN论文概要(贡献)网络结构和损失函数pytorch代码实现1. 准备工作1.1 数据下载并放到合适位置 2. 开始训练和测试 源码详解1. 数据集的加载: data_utils.py2. 网络模型&#xff1a; model.py2.1 生成器: Generator2.2 判别器&#xff1a;Discrimi…

超分辨率——基于SRGAN的图像超分辨率重建(Pytorch实现)

基于SRGAN的图像超分辨率重建 本文偏新手项&#xff0c;因此只是作为定性学习使用&#xff0c;因此不涉及最后的定量评估环节 目录 基于SRGAN的图像超分辨率重建1 简要介绍2 代码实现2.1 开发环境2.2 主要流程2.3 构建数据集2.4 构建生成模型&#xff08;Generator&#xff09…

SRCNN神经网络

0 前言 超分辨率技术&#xff08;Super Resolution,SR)是指从观测到的低分辨率图像重建出相应的高分辨率图像&#xff0c;在监控设备、卫星图像和医学影像等领域都拥有着重要的应用价值。 1 SRCNN SRCNN是深度学习用在超分辨率重建上的开山之作。 其结构十分简单&#xff0c…