【导读】前不久,写过一篇关于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后续,很简单?相关推荐

  1. C#中你想象的Task,很简单?

    [导读]网上关于Task的文章如数家珍,不过有一部分并未谈到一个根本的问题,所创建的Task一定在线程池上运行?如何合理的使用Task? 这里并不会去重新讲解每一个APi的使用,没有任何意义,这属于包 ...

  2. Spring Mvc中使用Task实现定时任务,以及遇到的一个问题

    Spring中实现定时任务其实很简单,可以使用spring中自带的task 相当于轻量级的Quartz,并且spring 3.0 之后支持注解的方式,使用起来非常简单,方便,具体实现如下: 第一步,修 ...

  3. 为什么说“角色移动”看上去很简单,却需要极高的技术力与细节成本?

    "角色移动"是大部分游戏的玩法基础.不过在游戏中,他看起来如此的简单自然以至于很容易被玩家所忽略掉.实际上,角色的移动涉及到动画.渲染.物理.同步等多项开发技术以及大量的美术工作. ...

  4. 如何把音乐去掉人声只留伴奏?这两个方法很简单!

    在现代音乐制作中,有时候我们需要将音乐中的人声去掉,只留下伴奏.这可以用于制作卡拉OK版本的歌曲,或者在学唱歌时进行练习.下面将介绍两种简单而有效的方法. 方法一:使用记灵在线工具去除音乐中的人声 使 ...

  5. 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松

    阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松 一.概述 面试,难还是不难?取决于面试者的底蕴(技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想 ...

  6. amigo幸运字符什么意思_做个爬虫比你想象中简单!爬虫是什么?怎么做?

    戳蓝字"智森一号"发送你的问题! 网络爬虫它是一个技术,本身并不难. 有看过前面几篇文章的应该知道我经常说一句话,把复杂的过程简单化,重复的过程自动化. 大家可以套用这个公式去想一 ...

  7. (python)小最的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中

    问题描述 小最的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英文单词,软件会先在内存中查 ...

  8. 重写webFlux中的webFilter,随意跳转到指定的过滤器,其实很简单

    背景:由于webFlux中的webFilter没有对指定请求路径进行分流功能,因为过滤器就像一根管道,默认情况下过滤器执行的顺序是已经固定好了的,谁也不能插队,所以我希望过滤器可以通过我的请求来分发到 ...

  9. sat数学可以用计算机吗,原来SAT数学真没想象中那么简单!

    原标题:原来SAT数学真没想象中那么简单! 众所周知数学是中国学生的强项,很多报考SAT的学生都能拿到很高的分数甚至满分.很多人都说美国高考数学只相当于国内初中水平,就在这种"妖言惑众&qu ...

最新文章

  1. BugkuCTF-Misc:想蹭网先解开密码
  2. 使用mac m1跑fortran代码hello world
  3. A - Sliding Window POJ - 2823
  4. 二叉树前序遍历python输出_Python 二叉树查找 前序 中序 后序遍历
  5. DPM2012系列之十三:如何清理无法联系的客户端代理
  6. 18000字的SQL优化大全,收藏直接起飞!
  7. Linux 进程管理数据结构
  8. 谈谈asp.net中的% %,%= %,%# %%$ %的使用
  9. 【AdaBoost算法】积分图代码实现
  10. Django+xadmin的安装与配置
  11. SpringBoot 的错误处理机制
  12. ad建集成库_AD16创建集成库的步骤
  13. macbook2015年早期版本更换三星1T 980nvme遇坑过程
  14. [车联网安全自学篇] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」
  15. 计算机关闭地址栏历史,删除win10地址栏历史记录方法
  16. 嵌入式系统开发笔记19:CJ/T-188 冷热量表协议解析8
  17. 适合小白的 Asyncio 教程!
  18. 用python发邮件(带附件)
  19. 力扣-求关注者的数量
  20. 六十二、基础框架(二十)集合物件

热门文章

  1. #UnityTips# 2017.11.14
  2. 4.3.2 基于集合的操作
  3. Ubuntu16.04换源
  4. 各主流浏览器内核介绍
  5. php之简单使用数据库
  6. NOI导刊模拟2—电话网络 解题报告
  7. 职场智慧之如何提升自己在公司的价值
  8. vue使用process.env搭建自定义运行环境
  9. 中输入learn_Scikit-learn新版本发布,一行代码秒升级
  10. vcenter 6.7 (vcsa)部署指南