AppDomain,进程和线程的关系
还是用图来说明比较容易理解。
可以总结为以下几句话。
1,进程可以理解为程序(.exe)的实例。线程可以理解为一个虚拟的CPU。
2,一个进程可包含多个线程和多个Appdomain。
3,一个线程可以穿梭在多个Appdomain中,但在同一时刻,线程只会处在其中一个Appdomain中。
前台线程和后台线程
1,前台线程和后台线程的区别在于,应用程序必须运行完所有的前台线程才可以退出,而对于后台线程,可以不考虑其是否运行完而直接退出,所有的后台线程在应用程序退出时就自动结束了。
2,默认情况下,主线程和使用Thread创建的线程都是前台线程,除非手动设置IsBackground= true。
多线程和异步的区别
学习异步编程的时候,我总是分不清多线程和异步之间的区别。可以简单理解为:
相同:避免阻塞前台线程,提高程序的可响应性。
区别:
1,多线程只是实现异步的多种方式中的一种,比如为了实现异步,.net为我们提供了三种不同的异步实现方式,APM,EAP和TAP。
2,应用场景不同。多线程一般应用在计算密集型工作,而异步更适合在IO密集型工作。
.net中实现异步的几种方式
1,异步编程模型(APM)【不推荐】
2,基于事件的异步(EAP)【不推荐】
3,基于任务的异步(TAP)【推荐】
先了解下.net为我们提供了这几种方式实现异步,后面会分别总结。
线程的启动,挂起和结束
1,启动线程,Thread.Start方法。
2,挂起线程,也叫阻塞线程,Thread.Sleep方法。
3,结束线程,Thread.Abort方法。
Demo
上代码。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Threading.Tasks; 7 8 namespace AsyncCoding 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 var thread1 = new Thread(Go1); 15 thread1.IsBackground = true;//默认为前台线程 16 thread1.Start();//启动线程 17 18 Console.WriteLine("我是主线程,Thread Id:{0}", Thread.CurrentThread.ManagedThreadId); 19 20 Thread.Sleep(500);//挂起线程,模拟等待异步线程做事情 21 thread1.Abort();//结束异步线程 22 23 Console.ReadKey(); 24 } 25 26 public static void Go1() 27 { 28 Console.WriteLine("我是异步线程,Thread Id:{0}", Thread.CurrentThread.ManagedThreadId); 29 30 try 31 { 32 for (int i = 0; i < 10; i++) 33 { 34 Thread.Sleep(100);//模拟每次执行需要100ms 35 Console.WriteLine("异步线程运行:{0}", i); 36 } 37 } 38 catch (ThreadAbortException ex) 39 { 40 Console.WriteLine("异步线程被强制结束!"); 41 } 42 } 43 } 44 }
代码运行顺序。
运行结果。