会计学
1
C多线程技术
.NET对多线程的支持
,线程是使用Thread类来处理的,该类在命名空间中。一个Thread实例管理一个线程,即执行序列。通过简单实例化一个Thread对象,就可以创建一个线程,然后通过Thread对象提供的方法对线程进行管理。
线程的建立与启动
假定我们需要编写一个文件压缩软件,用户点击压缩按钮后开始压缩指定的文件。因为整个压缩过程需要一定的时间才能完成,而用户此时还可能需要移动或缩放程序的窗口,甚至暂停或中止当前文件的压缩。此时一般需要创建一个单独的线程来处理这个压缩过程使得在压缩过程中可以不中断用户界面的响应。因此,我们需要实例化一个Thread对象来创建这个线程:
// 假设DoCompress是前面已经声明了的一个ThreadStart委托
Thread compressThread = New Thread(entryPoint);
这段代码指定线程对象的实例名为compressThread。在一个应用程序中创建另一个线程,执行一些任务,通常称为工作线程(worker thread),这里compressThread就是一个工作线程,而Main()方法所在的线程常被称为主线程。
第1页/共23页
线程的建立与启动
从代码可以看出,Thread构造函数需要一个参数,用于指定线程的入口——即线程开始执行的方法,因为我们传送的是方法的详细信息,所以需要使用委托。实际上,该委托已经在命名空间中定义好了。它称为ThreadStart,其声明如下所示:
public delegate void ThreadStart();
传送给构造函数的参数必须是这种类型的委托。上面的例子中是entryPoint,我们来看如何定义这个委托:
// 实际线程执行的方法
static void DoCompress()
{
// 压缩代码
}
ThreadStart entryPoint = new ThreadStart(DoCompress);
线程对象建立完成后,新线程实际上并没有执行任务,它只是在等待执行。我们需要显式地调用Thread对象的Start()方法来启动线程:
();
此外还可以使用Thread对象的Name属性给线程赋予一个友好的名称。
第2页/共23页
线程的挂起、恢复与终止
启动了一个线程后,线程将运行到所在的方法结束为止,在此期间还可以挂起、恢复或中止它。挂起一个线程就是让它进入睡眠状态,此时,线程仅是停止运行某段时间,不占用任何处理器时间,以后还可以恢复,从被挂起的那个状态重新运行。如果线程被中止,就是停止运行,Windows会永久地删除该线程的所有数据,所以该线程不能重新启动。
继续上面的文件压缩例子,假定由于某些原因,用户界面线程显示一个对话框,允许用户选择临时暂停压缩过程。在主线程中编写如下响应:
();
如果用户以后要求恢复该线程,可以使用下面的方法:
()
最后,如果用户决定不需要继续压缩的话,单击取消按钮,可以使用下面的方法:
()
第3页/共23页
线程的优先级
如果在应用程序中有多个线程在运行,但一些线程比另一些线程重要因而需要分配更多的CPU时间该怎么办?在这种情况下,可以在一个进程中为不同的线程指定不同的优先级。一般情况下,如果有优先级较高的线程在工作,就不会给优先级较低的线程分配任何时间片,其优点是可以保证给接收用户输入的线程指定较高的优先级。在大多数的时间内,这个线程什么也不做,而其他线程则执行它们的任务。但是,如果用户输入了信息,这个线程就立即获得比应用程序中其他线程更高的优先级,在短时间内处理用户输入控件。
线程的优先级定义为ThreadPriority枚举类型,取值如表所示:
线程的优先级及其含义
第4页/共23页
线程的优先级
高优先级的线程可以完全阻止低优先级的线程执行,因此在改变线程的优先级时要特别小心以免造成某些线程得不到CPU时间。此外,每个进程都有—个基本优先级,这些值与进程的优先级是有关系的。给线程指定较高的优先级,可以确保它在该进程内比其他线程优先执行,但系统上可能还运行着其他进程,它们的线程有更高的优先级。如Windows给自己的操作系统线程指定高优先级。
在【】中,对Main()方法做如下修改,就可以看出修改线程的优先级的效果:
// 建立新线程对象
ThreadStart workerStart = new ThreadStart(DisplayNumbers);
Thread workerThread = new Thread(workerStart)
C多线程技术学习教案 来自淘豆网www.taodocs.com转载请标明出处.