第14章 线程和异步编程(2)

2019-04-23 14:38

《基于VB.NET的.NET Framework程序设计》教学指导手册—详细教案

所以程序执行时,只能排队,程序只有执行后才能获得结果。因此,如何安排和调度计算机上执行的任务很繁琐。 随着技术的发展,如今的CPU都具备了多任务的能力,同时,操作系统也有能力使用硬件提供的这种功能,现在的多用户操作系统一般都可以同时运行多个程序,每一个程序都被当作一个独立的单元进行管理,虽然某一个时刻只能有一个程序在运行,但是通过操作系统的调度,多个程序看起来像同时在运行,并且当一个程序需要等待外部设备(比如从硬盘上读取数据)时,操作系统可以充分利用CPU空闲的时间,让另外一个程序占用CPU,完成所需的运算,因此多用户处理可以同时运行多个应用程序,可以让很多用户同时使用一台计算机;此外,还可以充分利用CPU运算资源,当有些应用程序需要等待用户输入或者等待外部设备读取数据时,可以把CPU让给其他程序继续执行。 在Windows应用程序编程中,在很多方面都使用了多用户处理:第一是Windows应用程序界面,Windows应用程序是通过消息机制来响应用户输入和操作系统所传递的信息,通常情况下,一个Windows应用程序只包括一个程序运行单元,因此在执行一些慢速操作(比如网络通信)时,或者操作硬盘上的大文件(比如读取文件)时,会发现Windows应用程序的界面无法响应。其原因是CPU不能同时进行Windows应用程序界面的更新、读取网络数据或硬盘数据的操作,因此为了避免应用程序界面无法响应,可以利用多任务处理技术,用另外一个任务读取数据、访问磁盘和网络,而使应用程序界面不受到任何的干扰,像正常情况下一样,用户可以拖动应用程序界面、操作界面上的控件。另一方面,在网络通信中的服务器应用程序中也广泛使用多任务处理。通常情况下,网络应用程序不会只和一个客户端通信,这时就需要编写多用户处理程序,让程序能够同时和多个远程的应用程序进行通信。服务器应用程序需要处理的客户请求量非常大,服务器应用程序通常还部署在多CPU的计算机上,为了充分利用多CPU6

第14章 线程和异步编程

的处理能力,为了提高并发的客户程序的数量,必须使用多任务处理技术。 要启用一个线程,首先要创建一个线程对象,这个线程对象是用来管理线程、停止线程和设置线程参数的引用对象,所以必须首先创建一个线程对象。在.Net里,线程对象是由Thread类定义的。因此在初始化Thread类时,Thread类初始化的构造函数接收一个参数,这个参数就是后面要讲到的委托,它实际上接收的参数是一个委托对象,委托对象的类型是ThreadStart,要创建的就是一个ThreadStart类型的委托,把它传递给线程对象的构造函数。创建委托时,需要指定委托所指向的函数,这个函数就是线程函数,这里创建的委托就是连接线程对象和线程函数的中介对象。通过这种方式创建ThreadStart委托,就能把线程函数和线程本身联系在一起。 现在我们来具体演示一下代码: 课堂演示 讲解课本14.2.1 演示: 我们现在应该知道Thread类的重要性了。那我们现在具体来了解一下类的部分公共属性。 讲解表格:14-1 课堂演示(14.2.2.2中的代码) 讲授: 托管线程既可以作为后台线程运行,也可以作为前台线程运行。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。 通过设置Thread.IsBackground属性就可以控制线程指定为后台线程或前台线程。 阅书:14.2.2 幻灯:第10页 7

《基于VB.NET的.NET Framework程序设计》教学指导手册—详细教案

讲解课本:14.2.2.1 创建线程时,还可以为线程设置属性和参数,比方设定线程的名字和优先级——可以给线程起一个比较形象的名字;线程运行时,可以配置优先级的高低,如果优先级较低,那么就占用较少系统资源,只有当重要的线程都空闲时,它才会执行。如果执行的动作比较重要,必须及时处理,那就应该把优先级设置为高,可以通过Priority属性设计线程的优先级;另外还可以通过Thread. IsBackground属性将线程设定为后台线程或前台线程,如果是前台线程,应用程序在运行的时候就会检测,只有当程序中所有的前台线程都停止时,系统才会关闭应用程序,但如果是后台线程,程序在关闭时,不会等待后台线程的停止,也就是说一个应用程序的停止只和前台线程是否停止有关。后台线程也许只运行到一半,并没有被安全地关闭,但是操作系统在执行操作的时候,并不会管后台线程是不是已被正确关闭或停止,或者说是否处于一个可以停止的状态。系统会强行关闭后台线程。所以在设置线程是前台还是后台线程时,必须考虑这个线程制定的任务是不是很重要,是不是应该在程序关闭前保存线程中的数据。如果是前台线程,这个线程不停止,程序就不能够停止运行。 讲授: 阅书:14.2.3 可以利用线程提供给我们的接口,也就是说幻灯:第11页 一些方法可以去管理线程。 例如,可以调用Thread.Sleep方法让这个线程停止运行一段时间,这里的3000代表3000毫秒,也可以调用Resume 方法恢复线程的运行,还可以调用线程的Join方法,等待线程的退出。在主线程里首先调用Start()方法,这个线程开始运行了,它运行多久呢?这个情况可能很难确定,因主线程希望t线程执行完毕后再继续进一步的操作,此时就可以这样写:启动主线程后再调用t.Join(),主线程就开始等待,当子线程8

第14章 线程和异步编程

运行完毕以后,Join()方法才会返回,也就是说主线程调用Join方法时,一旦这个方法返回,说明子线程已经结束,调用Join()方法的线程已经运行完毕。用这种方式来等待一个线程来停止运行。另外还可以使用线程的WaitHandle方法去等待一些事件,也就是说这个线程继续运行,可能必须要满足一些额外的条件后才能运行,这些条件在时候满足地呢?不一定,所以需要等待这些事件,等待这些条件,这时候可以调用WaitHandle方法,通过WaitHandle类里面的方法来完成这个工作。另外可以通过Thread.ThreadState属性去了解当前线程是处于运行状态还是停止状态。可以访问这个属性来获得当前线程的状态,通过线程提供的这些接口,可以控制线程的运行。通常来说,控制工作是由主线程完成的,即主线程会控制所创建的子线程的工作方式。除了通过程序显式地调用某个线程的方法,控制线程的运行,还有另一种方法可以控制线程的运行,即由操作系统根据情况去调度线程,让线程在不同状态之间进行变换,这是操作系统能够完成的功能。 讲解课本:14.2.3 讲授: 阅书:14.2.4 接下来介绍线程本地存储区的概念。线程本地存储区是指每个线程独有的一块存储数据的内存地址,它的用途是什么呢?每个线程可能有一些自己线程独有的数据,代表着自己线程的状态。声明的线程对象里所包含的线程类、线程方法等都是一样的,但是在初始化时,这些线程内部可以拥有独立的本地存储区域里面的数据,每个线程的数据都是不同的。虽然它们的声明方式相同,但是在运行时,每一个线程只能看到自己的那份数据,修改自己的那份数据,而不会影响到其他的线程。线程本地存储区专门用来存储线程所用到的数据,因此可以在声明线程变量时,加上[ThreadStatic]属性,把它放在变量前面。[ThreadStatic]属性表明该线程变量,如count,是和线程紧密相关的,它只属于某一个特殊的线程,不同线程中的这个

幻灯:第12页 9

《基于VB.NET的.NET Framework程序设计》教学指导手册—详细教案

数据是不一样的,而且是不能相互访问的。 讲解课本:14.2.4 讲授: 线程在运行时候很可能因为主程序出现了一些错误或者一些特殊的情况,需要强行停止,这时候就可以调用一些方法来完成这样的操作,可以调用线程的Interrupt方法,一旦对某个线程调用了这个方法,无论当前线程处于运行、等待还是睡眠,这个线程马上会被唤醒。并且无论这个线程运行到线程函数里的哪个代码,在被主线程调用了Interrupt方法以后,或者在其他线程中调用了.Interrupt方法以后,就会在这个线程的线程函数所执行到的位置抛出一个异常ThreadInterruptedException,也就是说可以在线程函数里捕获异常,一旦发现在运行到某个位置的时候,捕获了一个ThreadInterruptedException,并不表明函数内部的某个错误导致了这样一个异常的产生,而是由于外面另外一个线程调用了这个线程的Interrupt方法,终止了这个线程的执行。因此,可以通过这个异常来判断是否调用了Interrupt方法,另外可以使用Thread.Abort 来终止线程,这个方法并不能够立刻停止线程,因为该方法会引发一个ThreadAbortException 异常,可以让线程内部的方法来进行处理,所以线程内部的异常处理函数会处理它。因此调用Abort后,不会马上停止线程函数的运行,接下来将调用Thread.Join方法,等待线程终止,这就是Abort和Interrupt方法的区别,它们抛出的异常的类型是不同的,而且Thread.Abort方法不能够马上被终止。 讲解课本:14.2.5 阅书:14.2.5 幻灯:第13页 10


第14章 线程和异步编程(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:汽车销售管理系统报告 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: