- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第12章--C#程序设计
C#程序设计 第十二章 多线程 内容提要 12.1 进程 12.2 多线程 12.3 线程同步 12.4 线程池 12.5 跨线程的控件访问 12.6 问与答 12.7 思考与练习 12.8 实战任务 本章重难点 进程与线程的概念 多线程的意义 多线程的典型同步方式 线程池的意义 12.1 进程 进程是指一个程序(若干静态指令序列)的动态执行过程 在.Net Framework中,进程相关的最重要类是Process 12.1 进程 Process常用属性 12.1 进程 Process常用方法 12.2 多线程 线程相关最重要的类就是Thread类 线程分为两类:前台线程和后台线程。 这两类线程的唯一区别就是:当进程的所有前台线程都停止时,后台线程将自动终止。 12.2 多线程 Thread的常用属性 12.2 多线程 Thread的常用方法 12.2 多线程 线程的优先级Priority是枚举类型: ThreadPriority.AboveNormal:高于普通 ThreadPriority.BelowNormal:低于普通 ThreadPriority.Highest:最高 ThreadPriority.Lowest:最低 ThreadPriority.Normal:普通 12.2 多线程 创建线程的Thread构造函数重载 public Thread(ThreadStart start) public Thread(ParameterizedThreadStart start) 两个参数对应的委托声明形式如下: public delegate void ThreadStart(); public delegate void ParameterizedThreadStart(object obj); 12.3 线程同步 Lock Monitor ManualResetEvent 12.3 线程同步 Lock lock是用来进行同步的最简洁的方式之一,可以认为是Monitor的精简版。 12.3 线程同步 Lock的代码 class ThreadTest { object o=这是用来做锁的引用型变量; bool flag; public void M() { lock (o) { if (!flag) { Console.WriteLine(OK); flag = true; } } } } 12.3 线程同步 Monitor 12.3 线程同步 public void M() { Monitor.Enter(o); { if (!flag) { Console.WriteLine(OK); flag = true; } } Monitor.Exit(o); } 12.3 线程同步 ManualResetEvent 通过在线程之间收发信号进行通信,从而实现同步处理,该种方式称为同步事件。 该类的对象实例具有两种状态,即有信号和无信号。 要想给该类的对象设置状态,可以借助两种方式: 构造函数:ManualResetEvent mre=new ManualResetEvent(t/f) 方法调用: mre.Set() / mre.Reset() 12.3 线程同步 ManualResetEvent实现同步原理: 假设有两个线程T1,T2,两个线程都需要访问某个共享数据,设其应该的访问顺序是T1先而T2后。 实现方式:首先通过构造函数实例化mre,并将其置为无信号状态;其次由于我们希望T1在前而T2在后,故在T2中调用 mre.WaintOne()使得T2暂停执行,而在T1中,一般在需要锁定的代码前面调用mre.Reset()方法,当锁定的代码执行完毕时,调用mre.Set()方法使得mre变为有信号状态,此时T2中将接收到该信号,并继续执行,从而实现了T1先而T2后的目的,即完成了线程的同步。 12.4 线程池 线程池是用于在后台执行多个任务的线程集合。 多线程技术的利用大大提高了CPU吞吐能力,然而大量线程频繁的创建、销毁等操作将耗费很多宝贵资源,影响系统的性能。 线程池解决该问题的原理:当有任务到达时,将从线程池中分配一个线程来完成新的任务,当这个任务完成时,该线程重新回归线程池等待下次调用,而不会被销毁。这样就节约了大量的线程创建和销毁所消耗的资源,同时保留了多线程的优势。 12.4 线程池 线程池对应的类为ThreadPool,该类是一个静态类 QueueUserWorkItem,它具有两种重载形式: public static bool QueueUserWorkItem(Wait
文档评论(0)