C# 的 Task、Thread、ThreadPool 之间有什么异同?

Thread就是Thread,需要自己调度,适合长跑型的操作。

ThreadPool是Thread基础上的一个线程池,目的是减少频繁创建线程的开销。线程很贵,要开新的stack,要增加CPU上下文切换,所以ThreadPool适合频繁、短期执行的小操作。调度算法是自适应的,会根据程序执行的模式调整配置,通常不需要自己调度线程。另外分为Worker和IO两个池。IO线程对应Native的overlapped io,Win下利用IO完成端口实现非阻塞IO。

Task或者说TPL是一个更上层的封装,NB之处在于continuation。continuation的意义在于:高性能的程序通常都是跑在IO边界或者UI事件的边界上的,TPL的continuation可以更方便的写这种高scalability的代码。Task会根据一些flag,比如是不是long-running来决定底层用Thread还是ThreadPool,另外也做了些细节优化,比如同一个线程跑好几个Task,比如continuation时根据情况让CPU空转几毫秒来等待前置Task结束,都是为了减少CPU上下文切换。

结论:能用Task就用Task,底下都是用的Thread或者ThreadPool。但是要注意细节,比如告诉Task是不是long-running;比如尽量别Wait;再比如IO之后的continuation要尽快结束然后把线程还回去,有事开个Worker做,要不然会影响后面的IO,等等。

另外还有个特别的是Timer,所有Timer实例都是在一个专门的Timer线程上调度的。所以不要写的很重,要不然原本已经很低的精度会更加惨不忍睹。

时间: 2024-08-17 00:09:23

C# 的 Task、Thread、ThreadPool 之间有什么异同?的相关文章

[多线程]thread,threadpool,task及TPL知识点整理

简单理解 Thread:是一个指令序列,个体对象. Threadpool:在使用Thread的过程中,程序员要为每个希望并发的序列new一个线程,很麻烦,因此希望有一个统一管理线程的方法,程序员就不需要关注线程的申请管理问题,所以就对Thread进行一系列封装,有了ThreadPool.使用Threadpool,把需要并发的序列添加进线程池,线程池根据其线程列表中的线程的空闲情况,动态为并发序列申请线程. Task:再后来,程序员发现在使用Threadpool的过程当中还是存在很多不便,比如:(

编写高质量代码改善C#程序的157个建议——建议80:用Task代替ThreadPool

建议80:用Task代替ThreadPool ThreadPool相对于Thread来说具有很多优势,但是ThreadPool在使用上却存在一定的不方便.比如: ThreadPool不支持线程的取消.完成.失败通知等交互性操作. ThreadPool不支持线程执行的先后次序. 以往,如果开发者要实现上述功能,需要完成很多额外的工作.现在,FCL中提供了一个功能更强大的概念:Task.Task在线程池的基础上进行了优化,并提供了更多的API.在FCL 4.0中,如果我们要编写多线程程序,Task显

正则表达式,文件名通配,扩展正则之间的一些异同

正则表达式是一个神器,但初学linux时候还有文件名通配这样的东东.今天就总结一下文件名通配,正则表达式,扩展正则表达式之间有什么异同.可能写的不全,求指教. 使用方面: 正则多用来匹配过滤文本内容. 文件名通配符则用来匹配文件名较多. 支持命令: 文件处理,查看cp find ls rm mv touch 等一系列的文件匹配查找命令.(和上面说的是一个意思) 正则表达式则用在文本内容处理的各种工具grep,awk,sed,vim末行模式等. 匹配功能上正则规矩多,自然能力更强大,所以就这的区别

改善C#程序的建议9:使用Task代替ThreadPool和Thread

一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互性操作: 2: ThreadPool不支持线程执行的先后次序: 以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task.Task在线程池的基础上进行了优化,并提供了更多的API.在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的

使用Task代替ThreadPool和Thread

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=435 一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互性操作: 2: ThreadPool不支持线程执行的先后次序: 以往,如果开发者要

异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

1 进程-线程-多线程,同步和异步2 异步使用和回调3 异步参数4 异步等待5 异步返回值 5 多线程的特点:不卡主线程.速度快.无序性7 thread:线程等待,回调,前台线程/后台线程, 8 threadpool:线程池使用,设置线程池,ManualResetEvent9 Task初步接触 10 task:waitall waitany continueWhenAny continueWhenAll  11并行运算Parallel 12 异常处理.线程取消.多线程的临时变量和lock13 A

.net 多线程 Thread ThreadPool Task

先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name"></param>private void DoSomeThing(string name){                 Console.WriteLine($"开始执行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("

使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕

using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Ex.RulesTester.Threads { /// <summary> /// 异步等待所有线程结束通知测试 /// </summary> [TestClass] public c

RAC中SID,instance_number,thread#,undotbs之间的关系

一.参数节选 下面是从一个2节点11gR2 RAC节选的参数文件内容:...... GZYT1.instance_number=1GZYT2.instance_number=2 ...... GZYT1.thread=1GZYT2.thread=2GZYT1.undo_tablespace='UNDOTBS1'GZYT2.undo_tablespace='UNDOTBS2' 参数文件中参数的格式是:x1.x2=x3,其中x1表示的是SID(System Identifier),x2表示的具体参数