- 1、本文档共40页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c2005net3.0高级编程(第5版)第18章线程和同步
线程和同步
在应用程序中进行网络调用需要一定的时间。用户不希望在安装用户界面时只是等待,直到服务器返回一个响应为止。用户可以在这个过程中执行其他一些操作,甚至取消发送给服务器的请求。这些都可以使用线程来实现。
使用线程有几个原因。不让用户等待是其中一个原因。对于所有需要等待的操作,例如文件、数据库或网络访问的启动都需要一定的时间,此时就可以启动一个新线程,完成其他任务。即使是处理密集型的任务,线程也是有帮助的。一个进程的多个线程可以同时运行在不同的CPU上,或多个核心CPU的不同核心上。
还必须注意运行多个线程的一些问题。它们可以同时运行,但如果线程访问相同的数据,就很容易出问题。必须实现同步机制。
本章介绍用多个线程编写应用程序所需了解的知识,包括:
线程概述
使用委托的轻型线程
线程类
线程池
线程问题
同步技术
COM空间
BackgroundWorker
18.1 概述
线程是程序中独立的指令流。使用C#编写任何程序时,都有一个入口:Main()方法。程序从Main()方法的第一条语句开始执行,直到这个方法返回为止。
这个程序结构非常适合于有一个可识别的任务序列的程序,但程序常常需要同时完成多个任务。线程对客户端和服务器端应用程序都非常重要。在Visual Studio编辑器中输入C#代码时,Dynamic Help窗口会立即显示与所输入代码相关的主题。后台线程会有哪些信誉好的足球投注网站帮助。Microsoft Word的拼写检查器也会做相同的事。一个线程等待用户输入,另一个线程进行后台有哪些信誉好的足球投注网站。第三个线程将写入的数据存储在临时文件中,第四个线程从Internet上下载其他数据。
运行在服务器上的应用程序中,一个线程等待客户的请求,称为监听器线程。只要接收到请求,就把它传送给另一个工作线程,之后继续与客户通信。监听器线程会立即返回,接收下一个客户发送的下一个请求。
使用Windows任务管理器,可以从菜单View | Select Columns中打开Threads列,查看进程和每个进程的线程号。在图18-1中,只有cmd.exe运行在一个线程中,其他应用程序都使用多个线程。Internet Explorer运行了51个线程。
图 18-1
操作系统会调度线程。线程有一个优先级、正在处理的程序的位置计数器、一个存储其本地变量的堆栈。每个线程都有自己的堆栈,但程序代码的内存和堆由一个进程的所有线程共享。这使一个进程中的所有线程之间的通信非常快――该进程的所有线程都寻址相同的虚拟内存。但是,这也使处理比较困难,因为多个线程可以修改同一个内存位置。
进程管理的资源包括虚拟内存和Windows句柄,其中至少包含一个线程。线程是运行程序所必需的。
在.NET中,托管的线程由Thread类定义。托管的线程不一定映射为一个操作系统线程。尽管这种情况可能出现,但应由.NET运行库负责将托管的线程映射到操作系统的物理线程上。在这方面,SQL Server 2005的运行主机与Windows应用程序的运行主机完全不同。使用ProcessThread类可以获得内部线程的信息,但在托管的应用程序中,通常最好使用托管的线程。
18.2 异步委托
创建线程的一种简单方式是定义一个委托,异步调用它。第7章提到,委托是方法的类型安全的引用。Delegate类还支持异步调用方法。在后台,Delegate类会创建一个执行任务的线程。
提示:
委托使用线程池来完成异步任务。线程池详见本章后面的内容。
为了演示委托的异步特性,启动一个方法,它需要一定的时间才能执行完毕。方法TakesAWhile至少需要作为变元传送过来的毫秒数才能执行完,因为它调用了Thread.Sleep()方法:
static int TakesAWhile(int data, int ms)
{
Console.WriteLine(TakesAWhile started);
Thread.Sleep(ms);
Console.WriteLine(TakesAWhile completed);
return ++data;
}
要在委托中调用这个方法,必须定义一个有相同参数和返回类型的委托,如下面的TakesAWhileDelegate所示:
public delegate int TakesAWhileDelegate(int data, int ms);
现在可以使用不同的技术异步调用委托,返回结果。
18.2.1 投票
一种技术是投票,检查委托是否完成了任务。所创建的Delegate类提供了方法BeginInvoke(),在该方法中,可以传送用委托类型定义的输入参数。BeginInvoke()方法总是有两个AsyncCallback和Object类型的额外参数(稍后讨论)。现在重要的是Begin
您可能关注的文档
- 2013高考英语北京卷完形填空试题及答案详解ALeap(跳跃)toHonor.doc
- 2013~2014学年第二学期北京市石景山区初中信息技术试卷(笔试)参考答案.docx
- 2014-2015学年第二学期四年级下册语文期中试卷.doc
- 2013高考英语听说必背词汇.doc
- 2014-2015江都七校联谊八年级数学第一次月考试卷.doc
- 2014-2015学年新人教版九年级上数学教案【24圆】.doc
- 2014-2015学年高中化学2.2.5化学平衡图象同步讲练(鲁科版选修4).doc
- 2014-6-14八年级下册6-10单词英语单词默写版.doc
- 20140216正弦余弦定理解斜三角形练习及答案.doc
- 20141101作业答案.doc
文档评论(0)