Task.Factory.StartNew 和 Task.Run 到底有什么区别?

前言

Task.Factory.StartNew 和 Task.Run 都可以创建 Task:

Task.Factory.StartNew(() => { Console.WriteLine("Task.Factory.StartNew"); });Task.Run(() => { Console.WriteLine("Task.Run"); });

那它们之间有什么区别呢?

实现代码

查看这 2 个方法的内部实现,其内部实现逻辑其实是一样的,只是传的默认参数不同:

//Task.Factory.StartNew
public Task StartNew(Action action)
{Task? currTask = Task.InternalCurrent;return Task.InternalStartNew(currTask, action, null, m_defaultCancellationToken, GetDefaultScheduler(currTask),m_defaultCreationOptions, InternalTaskOptions.None);
}
//Task.Runpublic static Task Run(Action action)
{return Task.InternalStartNew(null, action, null, default, TaskScheduler.Default,TaskCreationOptions.DenyChildAttach, InternalTaskOptions.None);
}

最关键的参数区别是 Task.Run 传入了 TaskCreationOptions.DenyChildAttach

那这个参数有什么用呢?

DenyChildAttach

查看官方文档[1]的解释,DenyChildAttach 的作用是阻止子任务附加到其父任务

设想下从 Task 对象调用第三方库组件的应用。如果第三方库组件也创建一个 Task 对象,并指定 TaskCreationOptions.AttachedToParent 以将其附加到父任务中,则子任务中出现的任何未经处理的异常将会传播到父任务。这可能会导致主应用中出现意外行为。

创建代码验证一下:

Stopwatch stopwatch1 = new Stopwatch();
stopwatch1.Start();
var task1 = Task.Factory.StartNew(() =>
{Run();Console.WriteLine("Task.Factory.StartNew");
});await task1;
stopwatch1.Stop();
Console.WriteLine(stopwatch1.ElapsedMilliseconds);Stopwatch stopwatch2 = new Stopwatch();
stopwatch2.Start();
var task2 = Task.Run(() =>
{Run();Console.WriteLine("Task.Run");
});await task2;
stopwatch2.Stop();
Console.WriteLine(stopwatch2.ElapsedMilliseconds);

Run 方法代表执行相同的第三方库组件调用,内部使用了 AttachedToParent

private static void Run()
{Task.Factory.StartNew(() =>{Thread.Sleep(1000);Console.WriteLine("Run");}, TaskCreationOptions.AttachedToParent);
}

运行程序,你将会看到类似的如下输出:

Task.Factory.StartNew
Run
1080
Task.Run
1
Run

使用 Task.Factory.StartNew 必须等待 AttachedToParent 任务执行完,而 Task.Run 不必。

结论

一般情况下,尽量使用 Task.Run,如果需要更精细地控制任务的行为,比如 TaskCreationOptions, 才使用 Task.Factory.StartNew

想了解更多内容,请关注我的个人公众号”My IO“

参考资料

[1]

官方文档: https://docs.microsoft.com/zh-cn/dotnet/standard/parallel-programming/attached-and-detached-child-tasks

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

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

相关文章

mvc 职能划分_MVC架构的职责划分原则

来源:https://www.awaimai.com/873.html 歪麦博客最近负责一个项目,用了 Yii Framework 的 MVC 框架,刚开始自以为结构很稳健。但是随着对业务逻辑理解的深入,才开始意识到问题的严重。我错误地理解了 MVC 中的 Controller&…

Matlab clear, clc 和close函数

1、clear 作用:删除工作空间中的项目,释放系统内存 语法:

Highcharts数据表示(3)

Highcharts数据表示(3) 採用对象数组的形式,能够明白节点上每一个项目的值。可是当节点较多时,会造成大量的冗余代码。假设不写配置项名称,对象数组就能够简化二维数组。形式例如以下:data:[[Number|String , Number , Color , Nu…

Git撤销文件的修改(git checkout -- file)(git reset HEAD file)(git reset HEAD~)

1 撤销没有add到暂存储区文件 git checkout -- file 如果我们把文件rm了,git statu肯定会显示出来,我们怎么还原这个文件呢?还是用上面的命令 2 撤销到add到暂存储区文件 分2步 git reset HEAD file 上面命令把暂存区的拉到了工作区,但是这个时候文件依然修改了,我们还…

【Blog.Core开源】框架集成部门权限

(Blog.Core框架功能点概述)Blog.Core开源四年啦,一行行代码凝结了大家的热情和心血,基本功能骨架已完成,欢迎更多的公司和企业使用哟。真实公司留言盖楼可获得一对一技术指导:https://github.com/anjoy8/Bl…

[一个经典的多线程同步问题]解决方案一:关键段CS

前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题。 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理。 关键段CRITICAL_SECTION一共就四个函数,下面说一下这四个函数的原型…

如何设置Matlab输出到Word中图片的大小

方法一:快速型核心方法:设置Word显示比例100%,Matlab的图像大小与屏幕所见的相同;根据Word的排版要求,估计Matlab图像在Word中的大小,进而调整图像大小。具体操作:(以下操作应对图像绘制完成后进行,图像绘制中字体大小、线宽等都与排版需要一致,比如8号字体,需要故意…

服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...

一个 asp.net core 站点,之前运行在Linux 服务器上,运行一段时间后有时站点会挂掉,在日志中记录很多“EMFILE too many open files”的错误:Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMF…

python种颜色循环_Python 实现一个颜色色值转换的小工具

需求说明 公司的 UI 设计小哥,已经转用 Zeplin 很久了。Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示。我的数学没有好到直接看到十进制就可以心算得到十六进制的结果&#x…

bugly中批量隐藏版本

App项目使用Bugly的内测分发功能进行整包的测试,但日积月累之后,版本就会特别多。而线上同时跑的版本可能不过三个左右,那么多版本会干扰到查看崩溃、选择版本,如何隐藏呢? 右上角,更多 –> 产品设置 –…

检查点(Checkpoint)过程如何处理未提交的事务

每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么。执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改内存中的相关页,并在事务日志里记录整个事务。 …

axure如何导出原件_axure导出_axure怎么导出流程图

摘要 腾兴网为您分享:axure怎么导出流程图,随身行,轻轻家教,钱宝宝,美甲帮等软件知识,以及winrar美化版,九秀直播软件,中医养生平台,酚酞瓜,4399dm,移动硬盘检…

机器学习工作坊 - 计算机视觉

点击上方蓝字关注我们(本文阅读时间:2分钟)活动介绍四月的 MS Learn 学堂,我们将进入机器学习专题。 本月三期 MS Learn 学堂,我们会以工作坊的形式,结合具体应用实例,带领大家实践计算机视觉、…

React Native之提示Unable to load script from assets ‘index.android.bundle

1 问题 Unable to load script from assets index.android.bundle. Make sure your bundle is packaged correctly or youre running a packager server. 2 分析 在android的assets目录下面,没有找到index.android.bundle文件 2 解决办法 1) 在app/src/main目录下新建assets…

SQL分组处理气象数据及注意事项

问题:从全国所有气象站点数据气候数据表中(温度,降水量,风速等)找出研究区气象站点及所需气象信息。 解决: select 台站号 as 台站号,年 as 年,降水量 as 降水量,平均气温 as 年均温 from 站点气候年数据 …

服务器硬盘如何验收,系列服务器及存储测试安装验收报告.doc

系列服务器及存储测试安装验收报告p系列UNIX服务器测试安装说明1.测试p系列UNIX服务器系统开关机及系统启动测试目的:系统操作系统是否安装完好,主机能否正常开关机。测试方法:用正常关机手段关闭主机(# shutdown),然后…

arcgis server 无法手动删除切片

背景 问题 场景如下: 切片放置在专门的文件服务器上,通过unc共享路径对外共享。文件服务器的OS为windows server2008R2想手动更新切片服务的切片。发现同一切片服务,有的比例级别文件夹可以删除或者重命名。有的比例级别不可以。不能删除的比…

风变编程python离线版_如何看待风变编程的Python网课

第一次接触Python,其实就是朋友一句话,听说派森挺厉害的,时间大概是两个月前,当时网上搜了下,噢,英文叫Python,一种编程语言,然后就没有然后了... 最近朋友圈偶尔发现有个Python小课…

千寻和省cors精度对比_为什么使用千寻cors服务?它有什么优势?

过去20年,黑白屏手机升级成为智能手机、多数绿皮火车升级成了高铁、数控机床替代了大部分切割工人……科技创新正推动各行业向着便捷、高效、低成本的方向变革。技术升级为商业变革提供巨大动力,商业应用验证技术发展方向。高精度定位将成为公共服务在四…