c2005net3.0高级编程(第5版)第18章线程和同步.doc

c2005net3.0高级编程(第5版)第18章线程和同步.doc

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

aicencen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档