多线程,大部分编程言语都支持的一种特性。当然在C#中也不例外。而且在C#中的线程,是比较好用,比较方便的。
今天我将从最基础的Thread开始说起,来掰扯掰扯C#中多线程的那点事儿!
Thread基本用法
下面我们通过两个简单的函数,来模拟两个独立的任务:
static void Func1(){ for (int i = 0; i < 10; i++) { Console.WriteLine($"Func1 is Running {i} ......"); System.Threading.Thread.Sleep(500); }}static void Func2(){ for (int i = 0; i < 10; i++) { Console.WriteLine($"Func2 is Running {i} ......"); System.Threading.Thread.Sleep(333); }}
然后使用Thread,来同时启动两个任务:
static void Main(string[] args) { Console.WriteLine("Hello Thread World!"); var t1 = new System.Threading.Thread(Func1); var t2 = new System.Threading.Thread(Func2); t1.Start(); t2.Start(); t1.Join(); t2.Join(); }
最后简单看看运行结果:
可以看到,两个任务,在同时运行,在控制台中,交替输出结果。
如果将测试用的两个函数,换为我们自己的业务代码,在一定程度上可以达到并行执行的效果。从而提升运行的效率。
利用多线程技术,可以在我们的算法效率无法进一步优化的时候,利用现在CPU的核心比较多的特性,进一部提升我们的算法的效率,提升的幅度可以达到数倍到十几倍不等。
当然实际的效率提升情况,和我们的实际情况相关,也和我们自身的水平有关。甚至有些不适合多线程的任务,还有可能因为使用多线程而效率变低!
C#中多线程发展历程
早在2003年5月的C# 1.1 版本中,微软就加入了对Thread的支持。同时微软也在C#中支持了ThreadPool的,使用ThreadPool,通过一些策略,可以改善多线程导致的性能问题。
此后的很长一段时间,Thread和ThreadPool统治着C#中的多线程编程。
直到2010年4月,微软推出了.Net Framework 4.0,同时也正式推出了Task这个全新的多线程编程模型。
Task的性能更佳,默认使用线程池实现,并针对多核CPU做了大量性能优化,同时简化了API的调用方式。结合 async 和 await 关键字,让我们可以像写串行程序一样,编写并行程序!
踩坑记录
实在是太基础了,没有踩到坑!
如果你觉得不过瘾,没关系,关注外老师,后面将写一个系列的文章,来掰扯C#中多线程那点事。
下期预告
线程开的越多,程序运行越快吗?(开启线程的代价)
ThreadPool
多个线程之间的资源共享问题
多线程死锁问题
Task
Parallel
await/async
Linq与PLinq (ParallelEnumerable)
。。。 。。。