《C#_WinForm实践开发教程》chp5多线程编程技术.ppt

上传人:asd****56 文档编号:87328171 上传时间:2023-04-16 格式:PPT 页数:33 大小:770.50KB
返回 下载 相关 举报
《C#_WinForm实践开发教程》chp5多线程编程技术.ppt_第1页
第1页 / 共33页
《C#_WinForm实践开发教程》chp5多线程编程技术.ppt_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《《C#_WinForm实践开发教程》chp5多线程编程技术.ppt》由会员分享,可在线阅读,更多相关《《C#_WinForm实践开发教程》chp5多线程编程技术.ppt(33页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-基于C#语言主讲教师:钱 哨本课学时:72课时联系方式:Windows程序设计第五章、多线程编程技术n本章主要内容介绍5.1 计算机线程介绍5.2 System.Threading简介5.3 线程的优先级与锁技术CONTENT本章学习目标:本章学习目标:理解线程的概念理解.NET中线程的属性和方法创建和使用线程理解线程的特点、优点及使用场合同时执行所有任务,时间更少,效率更高 人 体5.1 线程简介读,写一览无遗血液循环在同一时间点执行各项进程 编译程序 发送/接收邮件 打印文件 其他操作系统允许计算机同时执行多项操作程序(进程)5.1 线程简介程序 1 程序 2线程 1线程 2线程 3线程

2、 1线程 2线程 3单独的执行路径5.1 线程简介进程:进程:是应用程序的一个运行例程,是应用程序的一次动态执行过程。线程:线程:是进程中的一个执行单元;是操作系统分配CPU时间的基本单元。nWindows是一个支持多线程的系统。n一个进程可以包含若干个线程。5.1 线程简介在以下情况中可能要使用到多线程:l程序需要同时执行两个或多个任务l程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等l后台程序5.1 线程简介多线程:多线程:在同一时间执行多个任务的功能,称为多线程或自由线程。多线程的优点:多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的

3、任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。多线程的缺点:多线程的缺点:对资源的共享访问可能造成冲突(对共享资源的访问进行同步或控制);程序的整体运行速度减慢等等。在C#应用程序中,第一个线程总是Main()方法,因为第一个线程是由.NET运行库开始执行的,Main()方法是.NET运行库选择的第一个方法。后续的线程由应用程序在内部启动,即应用程序可以创建和启动新的线程。5.2 System.Threading 命名空间5.2 System.Threading 命名空间在.NET程序设计中,线程是使用Thread类(或Tim

4、er类(线程计数器)、ThreadPool类(线程池)来处理的,这些类在System.Threading命名空间中:using System.Threading;Thread类:类:(实现线程的主要方法)一个Thread实例管理一个线程,即执行序列。通过简单实例化一个Thread对象,就可以创建一个线程,然后通过Thread对象提供的方法对线程进行管理。Timer类:类:适用于间隔性的完成任务。ThreadPool类:类:适用于多个小的线程。1、Thread 类的属性和方法引用System.Threading 命名空间Thread 线程实例名=new Thread(new ThreadStar

5、t(方法名);运行在线程上的方法只创建但不启动线程只创建但不启动线程线程实例名.Start();1、Thread 类的属性和方法属性属性CurrentThread获取当前正在运行的线程IsAlive指示当前线程的执行状态Name获取或设置线程的名称Priority获取或设置线程的优先级CurrentContext获取线程其中执行的当前上下文IsBackground指示线程是否为后台线程ThreadState获取或设置线程的当前状态方法方法Sleep()将当前线程阻塞指定的毫秒数Abort()终止线程Join()阻塞调用线程,直到某个线程终止时为止Resume()继续已挂起的线程Start()启

6、动线程Suspend()挂起线程GetDomain返回当前线程正在其中运行的当前域Interrupt中断处于WaitSleepJoin线程状态的线程ResetAbort取消为当前线程请求的Abort2、线程的生命周期在 I/O 操作期间线程被阻止线程已创建但并未启动线程已启动I/O 操作完成后运行线程被阻止,另一个操作正在进行提前中断或特地停止线程暂时中断的线程 线程已恢复等待等待/休眠休眠/加入加入已暂停已暂停正在运行正在运行已停止已停止未开始未开始已开始已开始已阻止已阻止暂停暂停发送发送 I/O 请求请求等待等待,休眠休眠,加入加入开始开始I/O 完成完成完成完成恢复恢复5.3 线程的建立

7、与启动新建一个线程的过程:只需将其声明并为其提供线程起始点处的方法委托,再用Thread.Start()方法启动该线程(1)声明:Thread a;(2)实例化a=new Thread(new ThreadStart(b);其中,b为新建过程中执行的过程名。(3)调用Thread.Start()方法启动该线程a.Start();5.3 线程的建立与启动using System;using System.Threading;public class A public void ff()/线程启动时调用此方法Console.WriteLine(A.ff()方法在另一个线程上运行!);Thread.

8、Sleep(3000);/将线程阻塞一定时间Console.WriteLine(终止工作线程调用此实例方法!);public static void gg()Console.WriteLine(A.gg()方法在另一个线程上运行!);Thread.Sleep(5000);/将线程阻塞一定时间Console.WriteLine(终止工作线程调用此静态方法!);例题1:线程的建立和启动5.3 线程的建立与启动public class Bpublic static void Main()Console.WriteLine(*线程简单示例!*);A a=new A();Thread s1=new Th

9、read(new ThreadStart(a.ff);s1.Start();Console.WriteLine(启动新线程ff()方法后,被Main()线程调用!);Thread s2=new Thread(new ThreadStart(A.gg);s2.Start();Console.WriteLine(启动新线程gg()方法后,被Main()线程调用!);Console.ReadLine();例题1:线程的建立和启动5.3 线程的建立与启动线程的挂起(或暂停)线程的挂起(或暂停)(1)调用Thread.Sleep()方法将线程挂起。注:Sleep()方法指定的时间以毫秒为单位。(2)调用

10、s1.Suspend()方法将线程挂起区别:前者为静态方法,并且使线程立即暂停一定时间;后者为实例方法,不会使线程立即停止执行,直到线程到达安全点之后,它才将该线程暂停。线程的恢复与终止线程的恢复与终止调用Resume()方法将线程恢复;调用Abort()方法将线程终止;线程的挂起、恢复与终止其他与操作线程相关的方法Join():使一个线程等待另一个线程停止Interrupt():中断处于JoinWaitSleep线程状态的线程。5.4 线程的优先级class SimpleThreadDemo static void Main(string args)Thread.CurrentThread.

11、Name=“主线程;Thread objThread=new Thread(new ThreadStart(ActionMethod);objThread.Name=“子线程;/启动子线程,并为该线程执行 ActionMethodobjThread.Start();/这将为主线程执行 ActionMethodActionMethod();static void ActionMethod()for(int count=1;count =4990;index-)Console.WriteLine(index);static void Main(string args)Thread objThrea

12、dOne=new Thread(new ThreadStart(TaskOne);Thread objThreadTwo=new Thread(new ThreadStart(TaskTwo);objThreadOne.Start();objThreadTwo.Start();static void TaskOne()for(int count=1;count=5;count+)Console.WriteLine(count*2);无优先级线程,同时执行,输出无序.例题1:static void Main(string args)Thread.CurrentThread.Name=“主线程;T

13、hread objThreadOne=new Thread(new ThreadStart(TaskOne);objThreadOne.Name=“子线程 1;Thread objThreadTwo=new Thread(new ThreadStart(TaskTwo);objThreadTwo.Name=“子线程 2;/这将启动子线程 objThreadOne.Start();objThreadTwo.Start();objThreadTwo.Priority=ThreadPriority.Highest;将在执行第一个线程前执行 objThreadTwo5.4 线程的优先级5.4 线程的优

14、先级【代码见下:】问题:请将代码执行多次,观察每次执行顺序的不同之处。为什么代码执行是完全不同呢?【结论:】如果不将线程按照一定的顺序运行,则线程代码在处理上将会混乱不堪。例题2:使用三个线程显示计数5.4 线程的优先级【线程优先级小结:】如果自行提高一个线程的优先级,那么该线程就会相应相应的获得更多的的获得更多的CPU时间时间;通过降低了线程的优先级,该线程就会被分配到比原来少的被分配到比原来少的CPU时间了时间了。你可以在一个线程开始运行前或是在它的运行过程中的任何时候改变它的优先级。理论上你还可以任意的设置每个线程的优先级,不过一个优先级过高的线程往往会影响不过一个优先级过高的线程往往会

15、影响到其他线程的运行,甚至影响到其他程序的运行,所以最到其他线程的运行,甚至影响到其他程序的运行,所以最好不要随意的设置线程的优先级。好不要随意的设置线程的优先级。例题1:使用三个线程显示计数【代码更改】5.5 线程的同步使用线程的一个重要方面是同步访问多个线程访问的任何变量同步访问多个线程访问的任何变量。n 背景:背景:当多个线程共享数据,其中一个或多个线程要修改数据时,有可能引起数据不统一等问题。n 同步:同步:是指在某一时刻只有一个线程可以访问某共享数据。1、同步的含义、同步的含义 同步问题的产生,主要是由于在高级语言的源代码中,大多数情况下看起来是一条语句,但在最后编译好的汇编语言机器

16、码中则会被翻译为许多条语句,从而在操作系统调度时被划分到不同的时间片中。例如5.5 线程的同步例如:message+=Hello world!;这条语句在C#语法上是一条语句,但在执行代码时,实际上它涉及到许多操作。需要重新分配内存以存储更长的新字符串,需要设置变量message使之指向新的内存,需要复制实际文本等。5.5 线程的同步 通过对指定对象的加锁和解锁可以实现同步代码段的访问。在.NET的System.Threading命名空间中提供了Monitor类类来实现加锁与解锁加锁与解锁。该类中的方法都是静态的。如下表:1、在、在C#中处理同步中处理同步锁定机制程序线程1 1线程2 2共享资

17、源 锁定机制保证每次只有一个线程可以访问共享资源缓冲和隔离示例class ThreadLockDemostatic void Main()Thread.CurrentThread.Name=“主线程;ThreadLockDemo objDemo=new ThreadLockDemo();Thread newThread=new Thread(new ThreadStart(objDemo.DoTask);newThread.Name=“子线程;newThread.Start();objDemo.DoTask();void DoTask()lock(this)for(int count=1;co

18、unt=10;count+)Console.WriteLine(“线程名:+Thread.CurrentThread.Name);实例化 newThread 线程并开始执行 DoTask()锁定当前实例 objDemo,在块中完成执行,然后释放对象5.5 线程的同步 C#中 lock关键字关键字提供了与Monitoy.Enter和和Monitoy.Exit同样的功能,这种方法用在你的代码段不能被其他独立的线程中断的情况。通过对Monitor类的简易封装,lock为同步访问变量提供了一个非常简单的方式,其用法如下:lock(x)/使用x的语句1、在、在C#中处理同步中处理同步 lock语句把变量

19、放在圆括号中,以包装对象,称为独占锁独占锁或排它锁排它锁。当执行带有lock关键字的复合语句时,独占锁会保留下来。当变量被包装在独占锁中时,其他线程就不能访问该变量。如果在上面的代码中使用独占锁,在执行复合语句时,这个线程就会失去其时间片。如果下一个获得时间片的线程试图访问变量,就会被拒绝。Windows会让其他线程处于睡眠状态,直到解除了独占锁为止。5.5 线程的同步【代码见下:】例题1:使用lock同步线程,完成10个线程的取钱工作【代码见下:】例题2:两个线程的互相执行过程演示5.5 线程的同步2、同步时要注意的问题、同步时要注意的问题线程同步非常重要,但只在需要时使用也是非常重要的。因

20、为这因为这会降低性能会降低性能。原因有两个:首先,在对象上放置和解开锁会带来某些系统开销,但这些系统开销都非常小。第二个原因更为重要,线程同步使用得越多,等待释放对象的线程就越多。如果一个线程在对象上放置了一个锁,需要访问该对象的其他线程就只能暂停执行,直到该锁被解开,才能继续执行。n结论:结论:在lock块内部编写的代码越少越好,以免出现线程同步错误。lock语句在某种意义上就是临时禁用应用程序的多线程功能,也就临时删除了多线程的各种优势。5.6 线程应用实例综合例题1:通过Process类获取系统进程列表。运行界面如下图所示:总结线程是在共享内存空间中并发的多道执行路径在 C#中,是使用 System.Threading 命名空间中的 Thread 类来创建线程的线程优先级可以更改为 ThreadPriority 枚举中定义的一个值C#中的 lock 关键字是实现线程同步的一种方法同步的线程称为安全线程除非绝对必要,否则不要创建线程安全的代码,因为添加不必要的锁定会降低性能

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com