线程处理
Visual Studio.NET允许用户开发多条互不相干的多线程的应用程序。也就是说,当用户在执行一个程序的时候,也可以在另外一条的线程独立地运行另外一个任务程序,这种过程被称为自由线程(Free Threading),对于用户而言,自由线程概念的引入,使得应用程序对用户的响应将更加积极,因为任务处理器能够在某一个线程正在运行时,依然保持界面对用户的响应,只要对用户响应的线程正在运行。而且,自由线程在运行大型的程序的时候,也将回很有用,因为随着运行任务的增加,用户可以多开辟几个线程来运行程序。
1.1.1何时使用线程
需要用户交互的软件必须尽可能快地对用户的活动作出反应,以便提供丰富多彩的用户体验。但同时它必须执行必要的计算以便尽可能快地将数据呈现给用户。如果应用程序仅使用一个执行线程,则可以结合使用异步编程与 .NET 远程处理或使用 ASP.NET 创建的 XML Web services,以便在使用自己计算机的处理时间以外再使用其他计算机的处理时间,从而提高对用户的响应速度并减少应用程序的数据处理时间。如果您正在进行大量的输入/输出工作,则还可以使用 I/O 完成端口来提高应用程序的响应速度。
1.1.2 多个线程的优点
无论如何,要提高对用户的响应速度并且处理所需数据以便几乎同时完成工作,使用多个线程是一种最为强大的技术。在具有一个处理器的计算机上,多个线程可以通过利用用户事件之间很小的时间段在后台处理数据来达到这种效果。例如,在另一个线程正在重新计算同一应用程序中的电子表格的其他部分时,用户可以编辑该电子表格。
无需修改,同一个应用程序在具有多个处理器的计算机上运行时将极大地满足用户的需要。单个应用程序域可以使用多个线程来完成以下任务:
- 通过网络与 Web 服务器和数据库进行通讯。
- 执行占用大量时间的操作。
- 区分具有不同优先级的任务。例如,高优先级线程管理时间关键的任务,低优先级线程执行其他任务。
- 使用户界面可以在将时间分配给后台任务时仍能快速作出响应。
1.1.3 多个线程的缺点
建议您使用尽可能少的线程,这样可以使操作系统资源的使用率最低,并可提高性能。线程处理还具有在设计应用程序时要考虑的资源要求和潜在冲突。这些资源要求如下所述:
- 系统将为进程、AppDomain 对象和线程所需的上下文信息使用内存。因此,可以创建的进程、AppDomain 对象和线程的数目会受到可用内存的限制。
- 跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数当前线程处于一个进程中,则其他进程中的线程的调度频率就会很低。
- 使用许多线程控制代码执行非常复杂,并可能产生许多错误。
- 销毁线程需要了解可能发生的问题并对那些问题进行处理。
提供对资源的共享访问会造成冲突。为了避免冲突,必须对共享资源的访问进行同步或控制。未能正确地使访问同步(在相同或不同的应用程序域中)会导致诸如死锁(两个线程都停止响应,并且都在等待对方完成)和争用条件(由于意外地出现对两个事件的执行时间的临界依赖性而发生反常的结果)等问题。系统提供了可用于协调多个线程之间的资源共享的同步对象。减少线程的数目使同步资源更为容易。
需要同步的资源包括:
- 系统资源(如通讯端口)。
- 多个进程所共享的资源(如文件句柄)。
- 由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段)。