Task vs Thread

C#中的Task和Thread都是用于实现多线程和并发操作的重要组件,但它们在设计哲学、使用场景和功能特性上存在显著差异,同时也有一些内在的联系。

Task vs Thread
设计理念:

Thread: 是操作系统级别的资源,代表了独立的执行路径。它是较为底层的抽象,直接映射到操作系统线程。使用Thread类可以创建和管理线程,但需要手动处理线程同步、异常处理等问题。
Task: 是.NET Framework 4引入的一个高级抽象,它建立在ThreadPool之上,旨在提供更高级别的并行和异步编程模型。Task是对线程的进一步封装,提供了丰富的API来管理异步操作,如取消、延续任务、异常处理等。
性能和资源管理:

Thread通常消耗资源较多,每个新创建的线程都会占用一定的内存空间,并且线程上下文切换成本较高。
Task利用了ThreadPool,通过任务调度器有效复用线程,减少了线程创建和销毁的开销。特别是对于短期、大量的并发任务,Task的性能往往优于直接使用Thread。Task还利用了本地队列来减少线程间的竞争。
API丰富性:

Task提供了更多高级功能,比如任务延续(ContinueWith)、任务取消(CancellationToken)、任务等待(Wait/WaitAll)、异常处理(通过AggregateException)等,使得编写并发代码更加方便和安全。
Thread虽然也能完成多线程任务,但在这些高级特性上的支持有限,需要手动编码实现类似功能。
生命周期管理:

Thread默认为前台线程时,必须等待其完成,主程序才能退出;而后台线程(IsBackground设为true)不会阻止程序关闭。
Task通常不直接控制应用程序的生命周期,它作为工作单元执行完毕后,由框架管理其生命周期,对程序的关闭影响较小。
联系
底层实现: 尽管Task是更高层次的抽象,但它在内部仍然可能使用Thread来执行任务,尤其是在没有其他更高效机制(如IO完成端口)可用的情况下。Task底层可以通过线程池线程来执行委托。
异步编程: 两者都服务于异步编程的目的,允许程序在等待某些操作(如I/O操作或计算)完成时,不阻塞主线程,从而提升程序的响应性和性能。
总结来说,Task是面向任务的并发模型,更适合现代C#应用开发,它在大多数情况下提供了一个更高效、更易用的并发解决方案。而Thread则提供了更底层的控制能力,适用于那些需要直接操作线程特性的场景。在实际开发中,推荐优先考虑使用Task,除非遇到特定需求,才考虑直接使用Thread

近日灵感飙升,突发奇想,模拟操作系统调度进程的方式写了个调度函数的类库,暂称为TaskThread,此类皆组合或继承自TTaskThread类,它们是一种奇妙的类,它们可以把一个一个的现成函数当成一个“process"强行塞入TaskThread的线程运行,用户不再需要额外初始化线程类。本函数库甚至能模拟操作系统的方式对“任务函数”进行调度运行,目前的策略支持批处理和并行模式,类似OS的批处理文件运行和多任务并发执行。为了便于C++用户者使用,除了对普通函数实现了“任务化”管理之外,本类库所有任务类均实现了对C++类函数作“任务化”管理的TClassTaskThread另一系列版本。 TTaskThread类库总共包括了大大小小几十个类,提供了跨平台(目前只实现的windows)的线程、互斥等基础类,主要实现功能的类是TClassTaskThread系列类,最多带9个参数的函数或类函数的任务管理,以下是类继承关系。 以下是类继承关系图 -TThreadMutex 互斥类 -TSimpleThread 基础线程类 -TClassTaskThread 运行类函数的任务类基类 -TClassNoRetNoArgTaskThread -TClassNoRet1ArgTaskThread -TClassNoRet2ArgTaskThread ...直到支持9个参数的无返回类函数任务类 -TTaskThread 运行普通函数任务类基类 -TNoRetNoArgTaskThread -TNoRet1ArgTaskThread -TNoRet2ArgTaskThread ......直到支持9个参数的无返回函数任务类 -TMutiTaskThread9BatchFacet 批处理运行适应类 -TMutiTaskThread9ParallelFacet并行运行适应类 -TClassMutiTaskThread9BatchFacet 批处理运行适应类 (类函数) -TClassMutiTaskThread9ParallelFacet并行运行适应类 (类函数) -TMutiTaskThread9 多任务管理器类 -TClassMutiTaskThread9 多任务管理器类 (类函数) -TMutiTaskThread9<TMutiTaskThread9BatchFacet> TBatchTaskThreads批处理管理器类 -TMutiTaskThread9<TMutiTaskThread9ParallelFacet> TParallelTaskThreads并行管理器类 -TClassMutiTaskThread9<TClassMutiTaskThread9BatchFacet> TClassBatchTaskThreads批处理管理器类 (类函数) -TClassMutiTaskThread9<TClassMutiTaskThread9ParallelFacet> TClassParallelTaskThreads并行管理器类 (类函数) 源代码因为大量使用模板、类函数指针等高级的C++特性,因此需要比较新版,接近C99标准的C++编译器,笔者是使用Borland C++ 6编译通过。 以下是一个管理批处理任务的使用示例: int c=0; void AsignC() { c=a+b; } int negtive(int d) { return -d; } TBatchTaskThreads tbth9; tbth9.PushBackTaskNoRet(AsignC); tbth9.PushBackTaskRet<int,int>(negtive,112); tbth9.PushBackTaskRet<int,int>(negtive,9); tbth9.Start(); tbth9.WaitForMutiTask(); ShowMessage(IntToStr(GetTickCount()-curtime)); ShowMessage(IntToStr(c)); int testi=tbth9.GetRunedRet<int>(1); ShowMessage(IntToStr(testi)); testi=tbth9.GetRunedRet<int>(2); ShowMessage(IntToStr(testi)); tbth9.ClearTask(); 可以看出,用户只需要把待批处理运行的函数按次序塞入tbth9,然后运行Start,再WaitForMutiTask,之后就可以按照需要取回函数运行结果。可见,TBatchTaskThreads 调用方式是非常简单的。 并行方式的调用方式类似,不再赘述。 以下是完整的源代码,有兴趣者可以复制并散播,但请不要去掉文件头的版权信息,请尊重作者的精神享有权。 笔者手中还有完整的C++Builder 6的DEMO演示例程,如有兴趣,请email至superyys@163.com索取,绝不吝啬。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值