你想象中的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实现断点续传中的暂停、取消呢?
你想象中的Task后续,很简单?相关推荐
- C#中你想象的Task,很简单?
[导读]网上关于Task的文章如数家珍,不过有一部分并未谈到一个根本的问题,所创建的Task一定在线程池上运行?如何合理的使用Task? 这里并不会去重新讲解每一个APi的使用,没有任何意义,这属于包 ...
- Spring Mvc中使用Task实现定时任务,以及遇到的一个问题
Spring中实现定时任务其实很简单,可以使用spring中自带的task 相当于轻量级的Quartz,并且spring 3.0 之后支持注解的方式,使用起来非常简单,方便,具体实现如下: 第一步,修 ...
- 为什么说“角色移动”看上去很简单,却需要极高的技术力与细节成本?
"角色移动"是大部分游戏的玩法基础.不过在游戏中,他看起来如此的简单自然以至于很容易被玩家所忽略掉.实际上,角色的移动涉及到动画.渲染.物理.同步等多项开发技术以及大量的美术工作. ...
- 如何把音乐去掉人声只留伴奏?这两个方法很简单!
在现代音乐制作中,有时候我们需要将音乐中的人声去掉,只留下伴奏.这可以用于制作卡拉OK版本的歌曲,或者在学唱歌时进行练习.下面将介绍两种简单而有效的方法. 方法一:使用记灵在线工具去除音乐中的人声 使 ...
- 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松
阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松 一.概述 面试,难还是不难?取决于面试者的底蕴(技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想 ...
- amigo幸运字符什么意思_做个爬虫比你想象中简单!爬虫是什么?怎么做?
戳蓝字"智森一号"发送你的问题! 网络爬虫它是一个技术,本身并不难. 有看过前面几篇文章的应该知道我经常说一句话,把复杂的过程简单化,重复的过程自动化. 大家可以套用这个公式去想一 ...
- (python)小最的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中
问题描述 小最的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英文单词,软件会先在内存中查 ...
- 重写webFlux中的webFilter,随意跳转到指定的过滤器,其实很简单
背景:由于webFlux中的webFilter没有对指定请求路径进行分流功能,因为过滤器就像一根管道,默认情况下过滤器执行的顺序是已经固定好了的,谁也不能插队,所以我希望过滤器可以通过我的请求来分发到 ...
- sat数学可以用计算机吗,原来SAT数学真没想象中那么简单!
原标题:原来SAT数学真没想象中那么简单! 众所周知数学是中国学生的强项,很多报考SAT的学生都能拿到很高的分数甚至满分.很多人都说美国高考数学只相当于国内初中水平,就在这种"妖言惑众&qu ...
最新文章
- BugkuCTF-Misc:想蹭网先解开密码
- 使用mac m1跑fortran代码hello world
- A - Sliding Window POJ - 2823
- 二叉树前序遍历python输出_Python 二叉树查找 前序 中序 后序遍历
- DPM2012系列之十三:如何清理无法联系的客户端代理
- 18000字的SQL优化大全,收藏直接起飞!
- Linux 进程管理数据结构
- 谈谈asp.net中的% %,%= %,%# %%$ %的使用
- 【AdaBoost算法】积分图代码实现
- Django+xadmin的安装与配置
- SpringBoot 的错误处理机制
- ad建集成库_AD16创建集成库的步骤
- macbook2015年早期版本更换三星1T 980nvme遇坑过程
- [车联网安全自学篇] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」
- 计算机关闭地址栏历史,删除win10地址栏历史记录方法
- 嵌入式系统开发笔记19:CJ/T-188 冷热量表协议解析8
- 适合小白的 Asyncio 教程!
- 用python发邮件(带附件)
- 力扣-求关注者的数量
- 六十二、基础框架(二十)集合物件