你想象中的Task后续,很简单?

【导读】前不久,写过一篇关于Task的简短文章,通过评论和转载得到好评,刚好我昨晚又写了一篇实现简单的消息队列也提到了Task,难道不应该是看具体执行什么操作,再考虑最佳方案?本文我们再次通过简短内容谈谈Task

在评论中我提到,Task默认在线程池中运行,若执行耗时操作,此时极容易造成线程阻塞,最终导致线程池激增,很显然这是不正确的做法

然鹅,有的童鞋说了,给Task配置TaskCreationOptions.LongRunning即可解决耗时问题,此时将创建线程而非在线程池运行,要是执行耗时操作且无需知道返回结果(见上一篇),那干嘛不直接用Thread呢?

TaskCreationOptions.LongRunning直接创建线程,所以本文我们重点来讲讲该选项的正确使用方式,知其然,知其所以然。

再谈Task创建线程

我们一直在强调配置Task选项即可创建非线程池线程,那么我们是否可以通过一个简单例子来进行一次论证呢?如下代码和图展足以胜前言,至于细节,只能自行研究源码得知

证明:TaskCreationOptions.LongRunning创建非线程池线程

public static Format _colorify { get; set; }
static void Main(string[] args)
{_colorify = new Format(Theme.Light);int workerThreads, completionPortThreads;ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);_colorify.WriteLine(workerThreads.ToString(), Colors.bgDefault);_colorify.WriteLine(completionPortThreads.ToString(), Colors.bgDefault);ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);_colorify.WriteLine(workerThreads.ToString(), Colors.bgDefault);_colorify.WriteLine(completionPortThreads.ToString(), Colors.bgDefault);_colorify.WriteLine("---------------------------", Colors.bgSuccess);Task.Factory.StartNew(() =>{ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);_colorify.WriteLine(workerThreads.ToString(), Colors.bgWarning);_colorify.WriteLine(completionPortThreads.ToString(), Colors.bgWarning);ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);_colorify.WriteLine(workerThreads.ToString(), Colors.bgWarning);_colorify.WriteLine(completionPortThreads.ToString(), Colors.bgWarning);}, TaskCreationOptions.LongRunning);Console.Read();
}

同样,反其道行之,将LongRunning选项配置去除,则如下橙色部分所展示的线程池工作线程将减少1即(32766)

Task配置LongRunning是否可用于异步呢?

针对此问题的答案,如果我们不能立马给出答案,那么说明我们对异步还没有充分的理解,这里给出我对异步浅薄的定义:添加必要的逻辑(状态机),以允许释放当前线程,若长时间运行的异步操作已完成,则将结果返回到同一线程中,换言之,异步仅用于I/O操作。

我们来看如下一个例子

static async Task Main(string[] args)
{await AsyncTaskFactoryNew();Console.Read();
}static async Task AsyncTaskFactoryNew()
{await Task.Factory.StartNew(() => {// do your logic});
}


通过上述我们对异步的定义,然后再来看上述例子,结果显而易见,因为用了异步后将释放当前线程,也就是在第一次await后,通过Task选项所配置的创建非线程池线程将会被销毁,所以给Task配置创建非线程池线程结合使用异步相互矛盾,故毫无意义。

几篇简短内容,仍只是冰山一角,其中所涉及内容仍有许多供我们好好研究,比如如何利用Task实现断点续传中的暂停、取消呢?

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

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

相关文章

5G在工业互联网应用的机遇与挑战

移动通讯经过十年一代的发展,已经从1G发展到了5G,峰值速率实现十年千倍的增长,1G到4G是面向个人的,而5G是面向产业互联网和智慧城市服务。5G是一个颠覆性的技术,低时延(每秒钟下载一部高清电影)…

[C#.NET 拾遗补漏]10:理解 volatile 关键字

要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理。比如对于下面这段代码:public class Example {public int x;public void DoWork(){x 5;var y x 10;Debug.WriteLine("x " x ", y " y);} }在 Releas…

跟我一起学.NetCore之MediatR好像有点火

前言随着微服务的流行,而DDD(领域驱动设计)也光速般兴起,CRQS(Command Query Responsibility Seperation--命令查询职责分离)、领域事件名词是不是经常在耳边环绕,而MediatR组件经常用来对其技术的落地,凭这,小伙伴们说…

不想写脚本清理 mongodb 中的垃圾数据,ttlIndex 能帮到你!

mongodb一直都在不断的更新,不断的发展,那些非常好玩也非常实用的功能都逐步加入到了mongodb中,这不就有了本篇对ttlindex的介绍,刚好我们的生产业务场景中就有一个案例。。。一:案例分析 生产的推荐系统要给用户发送短…

后端学习 - 基础 《Java编程的逻辑》读书笔记

文章目录一 基础概念1 有关Java2 JVM / JDK / JRE3 与C的联系和区别4 各类型数据占用空间大小5 和 equals() 的区别、hashCode() 方法6 包装类型7 final 关键字8 参数传递机制:值传递9 String 的内存情况10 访问修饰符11 引用拷贝、浅拷贝与深拷贝三 面向对象1 面向…

cheatengine找不到数值_彩票中奖500万,领了还不到一半?这些问题不解决,钱都拿不走...

长期以来,“一夜暴富”是很多人梦寐以求的梦想,而作为最能让人“一夜暴富”的方式要数我国的福利彩票了,这也是很多人最容易活动暴富的机会,不少彩民长久以来一直买彩票的梦想就是“一夜暴富”。而突然暴富是很多人的梦想&#xf…

一站式Web开发套件BeetleX.WebFamily

BeetleX.WebFamily是一款前后端分离的Web开发套件,但它并不依赖于nodejs/npm/webpack等相关工具;而使用自身实现的方式来完成前后端分离的Web应用开发;套件以组件的方式发布,只需要在项目引用相关组件即可实现前后端分离开发&…

.NET架构小技巧(2)——访问修饰符正确姿势

在C#中,访问修饰符是使用频率很高的一组关键字,一共四个单词六个组合:public,internal,protected internal,protected,private protected,private,如果你对这些关键字非常清楚,请跳过,节省时间;…

能源36号文解读_IDC报告预测:今年中国新能源汽车销量将达116万辆,未来五年复合增长率36%_详细解读_最新资讯_热点事件...

编者按:本文来自36氪「 未来汽车日报」,(微信公众号ID:auto-time),作者:秦章勇。 来源:IDC作者 | 秦章勇编辑 | 周游12月3日,在2020世界智能汽车大会上,IDG亚洲(国际数据(亚洲)集团)…

后端学习 - 容器

文章目录一 简介二 底层数据结构总结1 List2 Set3 Queue4 Map三 Collection 的子接口 List1 ArrayList 与 Vector2 ArrayList 与 LinkedList3 ArrayList 的 JDK 7/8 差异4 ArrayList 的构造方法与扩容机制*四 Collection 的子接口 Set1 HashSet、LinkedHashSet 和 TreeSet2 Has…

简单聊聊AspNetCore的启动流程

首先,得和大家达成一个共识,即AspNetCore项目其实就是一个控制台项目。可以简单的理解,AspNetCore就是将一个Web服务器宿主在一个进程(即控制台)中,然后它在这个进程中进行http请求的监听处理。AspNetCore中默认使用kestrel作为we…

共聚焦图片怎么加标尺_聚焦扶贫政策,打造小康生活

导语:农村独栋小楼、整洁的水泥路……扶贫产业蓬勃发展,我省结合实际,狠抓特色产业,助力脱贫攻坚,实现乡村振兴。武宁县:“四个聚焦”巩固脱贫成果2020年是全面建成小康社会目标实现之年,是全面…

后端学习 - 并发编程

文章目录零 基本概念1 CAS、ABA 问题和原子变量2 this 引用逸出3 不变性 immutable4 同步、异步、阻塞、非阻塞5 JMM6 同步方案演示:计数器 demo*一 进程与线程1 区别与联系2 Java内存区域3 线程组4 线程的上下文切换5 并发与并行6 线程的生命周期与状态二 线程间的…

打造跨平台.NET Core后台服务

续之前讲的在TopShelf上部署ASP.NET Core程序,作为后台服务运行,自从.NET Core 3.0出现以后,出现了自带的Generic Host,使得自托管服务变为可能。这种方式和TopShelf方式一样,可以直接F5进行服务的调试,也为…

iphone桌面横屏设置在哪里_我和我各司其职的桌面们

作者:旭彦兮沐桌面是只属于我们自己一个人的舞台,是与我们独处的好伙伴。好好布置一下自己的桌面,能在很大程度上保持我们心情的愉悦和做事情的效率,让我们保持专注当下的沉浸感。我最早了解到「桌面文化」其实是很早之前了&#…

后端学习 - RabbitMQ

文章目录一 MQ 的作用与基本概念1 流量削峰2 应用解耦3 异步调用4 四个基本概念二 核心模式1 工作队列模式(Work Queue)2 发布/订阅模式(Publish / Subscribe)3 路由模式(Routing)4 主题模式(To…

dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇

简介: Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构。重启开源后,我们不仅看到 Dubbo 3.0 最新的 Roadmap 发布,而且还看到阿里在自身电商开始推进 Dubbo 和内部 HSF 的融合,并在 双11 …

初识ABP vNext(12):模块的独立运行与托管

点击上方蓝字"小黑在哪里"关注我吧模块运行动态 C# API 客户端前言很久没更新这个系列。。。之前的章节中讲到ABP的模块是可以独立运行的,但是没有介绍具体怎么操作,本篇就来讨论一下模块如何独立运行,以及一些托管方式。本人也是处…

后端学习 - Spring5

文章目录一 简介二 IOC1 底层原理2 实现过程3 Spring 实现 IOC 的两个接口二 Bean1 普通 Bean 与 FactoryBean2 Bean 单例与否的设置3 Bean 的生命周期三 IOC 的 Bean 管理(XML)1 创建对象2 属性注入 - 使用 set 方法3 属性注入 - 通过有参构造器实现3 注…

吐槽一下Abp的用户和租户管理模块

1. 背景ASP.NET Core 基于声明的访问控制到底是什么鬼?聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息。-----------ClaimB站:438962688 Name:饭思思_weibo:538210234 Name:饭思思van姓名:不详 籍贯…