基于C#线程实验探究
2021-06-28刘毓聂思兵杨济宁
刘毓,聂思兵,杨济宁
(1.内江师范学院计算机科学学院(人工智能学院),四川 内江 641100;2.珠海博闻教育科技发展有限公司,广东 珠海 519000;3.内江职业技术学院,四川 内江 641111)
1 概述
程序执行流的最小执行单位,是行程中的实际运作单位,是进程中的实际运作单位[1];是进程中按顺序执行的控制流,每条线程承担各自的任务,一个进程中可以并发多个线程[2]。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
为提高程序的可靠性,简化编程代码,实现程序并发执行线程,线程采用代码与代码之间的隔离技术。由此可见,合理安排线程实验,对于C# 的实验有重要意义。
讨论C#线程实验,目的就是通过实验让学生掌握线程的创建与控制,包括创建线程、暂停和恢复线程、终止线程、设置线程执行的优先级,线程的同步方法。
2 C# 实现线程的常用方式
2.1 Thread类实现
在C#语言中线程(Thread)是包含在进程中的,它位于 System.Threading 命名空间中,线程的创建以及执行使用hread 类。
Thread类的实现方式,关键代码如下:
public void TestThread()
{
Thread thread = new Thread( TestAction);
//设置属性
thread.IsBackground = true;
thread.Name = "Test";
//启动线程 thread.Start();
}
private void TestAction()
{
//处理相关业务
}
主要操作步骤为:设置相关属性new Thread(TestAction);启动 thread.Start();处理的相关业务;执行相关业务操作等。
2.2 ThreadPool 线程池实现
需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类)。ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时释放资源。ThreadPool 线程池实现的关键,有如下几步:
设置相关属性;通过线程池自动分配线程执行对应的业务功能;实现线程处理的相关业务;执行相关业务操作等。
2.3 Delegate 实现的多线程
delegate由于需要不断的实例化,委托类将会消耗cup 和内存,其关键代码如下:
private void TestAction()
{
//处理相关业务
}
///
///子线程回调
///
private void CallBack(IAsyncResultar)
{
}
除此之外,还有Task 实现多线程,Parallel实现多线程等方式,这里不一一赘述。
3 C#线程实验的注意事项
在C#线程编程实践发现,单线程最显著的缺点是,当一个事件发生,程序进行一个耗时的运算动作时,UI线程会出现假死现象,此时会无视对用户的响应。多个执行流是多线程的特点,因此为了充分提高CPU的利用率。一个程序中可以同时运行和创建多个并行执行的线程来完成各自的任务。
在多线程程序中,线程的运行相互独立,互不干扰,从而提高程序的效率。但使用多线程存在诸多不利因素,线程越多占用内存也越多,线程越多协调和管理越麻烦, CPU需要花更多的时间,也存在访问共享资源时会彼此干扰,从而导致对他们的控制过程太复杂。以下两个问题也得一起注意:
3.1 操纵一个线程出现的异常
利用Thread.Start()方法重新启动线程oThread,但显然Abort()方法带来的后果是不可恢复的终止线程,所以最后程序会抛出ThreadStateException异常。其关键内容包括:
创建一个线程,使之执行Beta方法 ,该方法只是通知CPU此线程可以被执行,但具体执行时机则由CPU自行决定。
3.2 线程的优先级设置
线程的优先级设置应满足以下原则:
1)当线程之间同时需要CPU时,CPU按线程的优先级给予服务。
2)C#设计中,在创建线程时,可以设置5个不同的线程的优先级,不指定优先级,则系统为默认值ThreadPriority.Normal。
根据用户的响应轻重缓急,设置相应的线程的优先级,同时CPU会将更多的时间片分给优先级高的线程,在相同任务量的前提下,高优先级线程将会较快地完成任务。
4 C#多线程的典型应用实验
多线程编程应用广泛,主要有几个方面:
1)即时响应,后台线程完成特定操作。
2)多个线程参与,完成同类任务,提高并发性能。
3)一个任务可以有多个独立的步骤,多个线程可以并发执行各子任务,以用来提高任务处理效率,下面通过两个例子予以说明。
a)进度条
图1 系统方框图
分析:页面动态刷新,在主页面正常操作前提下,用后台线程来实现进度条。
首先,创建Winform页面,然后拖入进度条控件,篇幅关系,相关代码从略。
b)网络扒虫
获取网络资源,网络搜索功能实现,都利用了扒虫程序思想。一般情况下,扒虫程序耗时大,如果使用多线程编程,将节约许多时间。篇幅关系,相关代码从略。
5 总结
前面就C#实现线程的常用方式,C#线程的实验的注意事项,C#多线程的典型应用实验做了初步的讨论,关于C#线程实验注意的问题还很多,由于篇幅所限,这里不一一赘述。
文中的部分案例来自网络,由于出处较多,在此一并向作者致谢!