进程和线程的区别
进程是分配资源的基本单位,而线程是调度的基本单位。一个进程中通常包含若干个线程。
异步委托
在C#中实现线程的一种简单方式是定义一个委托,并异步调用它。
通过BeginInvoke()启动线程
通过EndInvoke()获得返回值
IAsyncResult类型的变量保存线程状态
Thread类
使用Thread类可以创建和控制线程,Thread类的构造函数的参数是一个无参无返回值的委托类型。
通过Start()方法启动线程
通过Join()方法让当前线程睡眠
因为Thread类构造函数是无参,那么要给线程传递数据怎么呢办?
我们需要自定义一个类,将数据传给自定义类,然后实例化,然后将方法传递给Thread类的构造函数。
后台线程和前台线程
只要有一个前台线程在运行,那么应用程序的进程就在运行。
Thread类创建的线程默认是前台线程,可通过修改IsBackground属性修改为后台线程。
线程的优先级
优先级影响线程的调度顺序。
Thread类可设置Priority属性修改线程优先级,Priority属性是一个ThreadPriority枚举定义的一个值。定义的级别有Highest ,AboveNormal,BelowNormal 和 Lowest。
控制线程
获取线程的状态(Running还是Unstarted,,,),当我们通过调用Thread对象的Start方法,可以创建线程,但是调用了Start方法之后,新线程不是马上进入Running状态,而是出于Unstarted状态,只有当操作系统的线程调度器选择了要运行的线程,这个线程的状态才会修改为Running状态。我们使用Thread.Sleep()方法可以让当前线程休眠进入WaitSleepJoin状态。
使用Thread对象的Abort()方法可以停止线程。调用这个方法,会在终止要终止的线程中抛出一个ThreadAbortException类型的异常,我们可以try catch这个异常,然后在线程结束前做一些清理的工作。
如果需要等待线程的结束,可以调用Thread对象的Join方法,表示把Thread加入进来,停止当前线程,并把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
线程池 ThreadPool类
创建线程需要时间。 如果有不同的小任务要完成,就可以事先创建许多线程 , 在应完成这些任务时发出请求。 这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。
任务
在.NET4 新的命名空间System.Threading.Tasks包含了类抽象出了线程功能,在后台使用的ThreadPool进行管理的。任务表示应完成某个单元的工作。这个工作可以在单独的线程中运行,也可以以同步方式启动一个任务。