创建时常用的枚举:

None、PreferFairness、LongRunning、AttacthedToParent、DenyChildAttach、HideScheduler

AttacthedToParent:

背景代码如下

  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace 多线程_List
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //创建了一个线程1
  12. Task t = Task.Factory.StartNew(() =>
  13. {
  14. Console.WriteLine("thread 1");
  15. Task t1 = new Task(() =>{
  16. Thread.Sleep();
  17. Console.WriteLine( "task 11");
  18.  
  19. });
  20. Task t2 = new Task(() => { Console.WriteLine("task 12"); });
  21. t1.Start();
  22. t2.Start();
  23. //下面continue中的新的线程 肯定是在 线程1之后
  24. //但是在线程1里面又另外启用了2 个线程 continue中的线程就未必在这两个线程执行完之后执行
  25. }).ContinueWith(_t=> {
  26. Console.WriteLine("thread 2");
  27. });
  28. Console.ReadKey();
  29.  
  30. }
  31.  
  32. }
  33. }

thread 1
thread 2
task 12
task 11

这时 如果要continue中启用的线程在task t内部所有线程执行完毕之后再执行可以使用 AttacthedToParent枚举

  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace 多线程_List
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //创建了一个线程1
  12. Task t = Task.Factory.StartNew(() =>
  13. {
  14. Console.WriteLine("thread 1");
  15. Task t1 = new Task(() =>
  16. {
  17. Thread.Sleep();
  18. Console.WriteLine("task 11");
  19.  
  20. }, TaskCreationOptions.AttachedToParent);
  21. Task t2 = new Task(() => { Console.WriteLine("task 12"); }, TaskCreationOptions.AttachedToParent);
  22. t1.Start();
  23. t2.Start();
  24. //下面continue中的新的线程 肯定是在 线程1之后
  25. //但是在线程1里面又另外启用了2 个线程 continue中的线程就未必在这两个线程执行完之后执行
  26. }).ContinueWith(_t =>
  27. {
  28. Console.WriteLine("thread 2");
  29. });
  30. //如果不允许t1 和 t2附加到t上面
  31. //}, TaskCreationOptions.DenyChildAttach).ContinueWith(_t =>
  32. //{
  33. // Console.WriteLine("thread 2");
  34. //});
  35. Console.ReadKey();
  36. }
  37. }
  38. }

执行结果:

thread 1
task 12
task 11
thread 2

AttacthedToParent的效果相当于t.WaitAll(t1,t2)

LongRunning :长时间运行的任务 ,如果你明知道是长时间执行的,建议你使用此枚举。因为这个枚举创建的线程是一个新建的Thread 而不是线程池的线程。为什么要这么搞呢,因为如果你不这么搞,使用的是线程池的线程,线程池的线程长期少一个的话,线程池会再创建一个线程,当你这个线程执行完毕还给线程池的时候,线程池的线程就比原来的线程池多一个,导致线程池线程过多,导致cpu切换时间变长等问题。

PreferFairness 让各个线程看起来公平点,会将task扔到ThreadPool的全局队列中,让workthread进行争抢,不这样搞默认会放进thread的一个本地队列中。

3 Task中的一些枚举 创建时候的、continue时候的的更多相关文章

  1. asp.net MVC 中枚举创建下拉列表?

    我将尝试使用 Html.DropDownList 扩展方法,但不能找出如何使用它的枚举. 让我们说我有一个这样的枚举: public enum ItemTypes { Movie = 1, Game ...

  2. 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数

    开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...

  3. 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念

    开篇介绍 在 SSIS Dataflow 数据流中的组件可以分为 Synchronous 同步和 Asynchronous 异步这两种类型. 同步与异步 Synchronous and Asynchr ...

  4. nodejs中使用worker_threads来创建新的线程

    目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE_E ...

  5. 【C# Task】理解Task中的ConfigureAwait配置同步上下文

    原文:https://devblogs.microsoft.com/dotnet/configureawait-faq/ 作者:Stephen 翻译:xiaoxiaotank 静下心来,你一定会有收获 ...

  6. Spring中常见的bean创建异常

    Spring中常见的bean创建异常 1. 概述     本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...

  7. 在Grunt task中集成Protractor

    Protractor是专为AngularJS应用程序编写的UI自动化测试框架.前端构建有很多构建工具,比如Grunt.Gulp等.一般我们会把这些构建工具作为集成集成的脚本执行工具.所以如果把Prot ...

  8. MAPINFO中利用GridMaker工具创建栅格图层

    在工作中需要使用栅格地图,以往都是由研发人员来创建,今天偶然发现Mapinfo中有GridMaker这样一个工具,结合网络搜索自己试了一下,居然做成功了,这里把步骤记录下来,方便以后查看. 1.首先在 ...

  9. access中根据一个表创建另一个

    access中根据一个表创建另一个 SELECT * INTO newTableFROM zD_qlr; SELECT * into mdFROM zd IN 'E:\fz\高阳\大姚\fz\bz\b ...

随机推荐

  1. u-boot分析1:Nandflash、Norflash启动

    了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核. u-boot全称:Univ ...

  2. JScript使用正则表达式的经验

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在JScript使用正则表达式时有不少元字符在试图对其进行匹配时需要进行特殊的处理.要匹配这些特殊字符,必须首先将这些 ...

  3. SDK应该包括什么东西

    作者:朱金灿 来源:http://blog.csdn.net/clever101 如果让你设计和开发一个SDK(软件二次开发包),你认为里面应该有什么东西?首先接口文件和库文件之类是必不可少的,否则别 ...

  4. get_slave_status.py

    #!/usr/bin/env python#-*- encoding: utf8 -*- import mysql.connectorimport get_mysql_conn_info    &qu ...

  5. python3 序列

    python中有很多内置序列 列表 元组 字符串 python中容器的概念 列表 元组 字符串 字典 集合 是可以改变的,元组不可改变 几乎可以在所有情况下用列表代替元组,只有一种情况下,是不可以的, ...

  6. vue学习笔记一:用Key管理可复用元素

    vue为了高效的渲染元素,会尽可能的复用组件,而不是从头渲染,如下案例 <template> <div id="app"> <template v-i ...

  7. java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递

    1.首先client须要引入 jquery-1.11.1.js 2.其次javawebproject里面须要引入jar包  [commons-beanutils-1.8.0.jar.commons-c ...

  8. js导出报表

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78376156 需求:项目中有一个学生签到模块需要导出每天的签到数据,一开始用poi在后 ...

  9. ios开发利用AFN检测网络状态

    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; [manager setRe ...

  10. [tmux] Create collections of panes using tmux windows

    In tmux, a window is a collection of panes. Creating multiple windows is a great way to organize you ...