http://www.google.com 这个就挺好的,比较全面。
但是建议你还是买本书看先。
每当我在博客园里看到http://www.google.com 这句话,通常就会看到你的ID“爱编程的大叔”~~~
Task是异步的一种封装方式。
异步分为两种:
1、CPU密集型
2、IO密集型。
其中CPU密集型是与CPU多核计算有关,可以利用多核和多线程的方式来最大限度利用CPU资源
而IO密集型是封装底层硬件的线程调度,来节省工作线程的等待时间,最大限度节约工作线程的占用时间。
Task底层封装的是线程池的线程,每次启动一个Task底层都会从线程池中分配一个线程去执行任务。
如果你的程序不是上面两种应用,不建议使用Task,以为线程的切换时有很大成本的。
更多可以参考:https://msdn.microsoft.com/zh-cn/library/dd460693(v=vs.110).aspx
Task可不是对线程池的封装,Task实际上要理解为对操作的一种特殊封装,它可能会用到线程,也可能使用你当前线程,具体是依赖于你TaskScheduler来确定的。而TaskScheduler就如同其名,确定了并行,异步,抢占线程和多线程下的控制。使用Task后可以将以前繁琐的各种异步多线程问题给抽象化,甚至代码逻辑上的线性,相对于传统的通过IAsyncResult或者Thread而言简单了不少。
@Daniel Cai: 不管是使用当前线程还是什么线程,其实说到底都是对线程池中的线程进行调度。有错吗?
@埋头前进的码农: 不是,不一定会使用线程池中线程,这个有较大的变数的.
比如最简单的场景,当你显式指定某个task是longrunning的(比如超过50ms的操作),那么相当于给了一个hint,这个时候task就会直接使用新线程来执行。
var tk=new Task(()=> { Console.WriteLine (Thread.CurrentThread.IsThreadPoolThread); },TaskCreationOptions.LongRunning); tk.Start();
建议你先了解什么是多线程,再来看这个,你这样反着来很麻烦的.