1.线程Thread
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行;对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行;等到后台线程执行完毕,再通知主线程,然后做出对应操作!
启动Thread线程
1 static void Main(string[] args) 2 { 3 // 启动多线程 4 Thread thread = new Thread(myThreadDemo); 5 thread.IsBackground = true; 6 thread.Start(); 7 8 for (int i = 0; i < 10; i++) // 主线程 9 { 10 Console.WriteLine("main is working..."); 11 } 12 thread.Join(); 13 } 14 15 static void myThreadDemo() 16 { 17 Console.WriteLine(" >> now statr thread...."); 18 Thread.Sleep(1000); 19 Console.WriteLine(" >> thread is over.."); 20 }
执行结果如图:
Thread thread = new Thread(myThreadDemo);启动无参无返回值ThreadStart线程,等同于 Thread thread = new Thread(myThreadDemo);
启动带参数Thread线程
1 static void Main(string[] args) 2 { 3 // 启动多线程 4 Thread thread = new Thread(new ParameterizedThreadStart(myThreadDemo)); 5 thread.IsBackground = true; 6 thread.Start("Ronaldo"); 7 8 for (int i = 0; i < 10; i++) // 主线程 9 { 10 Console.WriteLine("main is working..."); 11 } 12 thread.Join(); 13 } 14 15 static void myThreadDemo(object name) 16 { 17 Console.WriteLine(name.ToString()); 18 Console.WriteLine(" >> now statr thread...."); 19 Thread.Sleep(1000); 20 Console.WriteLine(" >> thread is over.."); 21 }
线程池
使用ThreadStart与ParameterizedThreadStart建立新线程非常简单,但通过此方法建立的线程难于管理,若建立过多的线程反而会影响系统的性能。
设想如果需要处理大量任务,例如网站后台对于HTTP请求的处理,那是不是要对每一个请求创建一个后台线程呢?显然这样对占用大量内存,而且频繁地创建的过程也会严重影响速度。为了应对这种情况,.net引入了线程池的概念。
线程池会把创建的线程保存起来,在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省了建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。
下面做个试验
for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem(m => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString()); }); } Console.Read();
可以看到,虽然执行了10次,但并没有创建10个线程。
ThreadPool可以使用工作者线程和委托类创建线程。
Task
static void Main(string[] args) { //StartNew .NetFramework4.0 Task t = Task.Factory.StartNew(() => { // Just loop. int ctr = 0; for (ctr = 0; ctr <= 10000; ctr++) { Thread.Sleep(1); } Console.WriteLine("Finished {0} loop iterations", ctr); }); Console.WriteLine("go on"); t.Wait(); //StartNew .NetFramework4.5 Task t2 = Task.Run(() => { // Just loop. int ctr = 0; for (ctr = 0; ctr <= 10000; ctr++) { Thread.Sleep(1); } Console.WriteLine("Finished {0} loop iterations", ctr); }); Console.WriteLine("go on"); //t2.Wait(); // 等待任务完成,再进行下次操作 Task.WaitAll(); // 等待任一一个任务完成 Console.WriteLine("where i am"); Task.WaitAll(t2); // 等待t2任务完成 }