C#高级语法——多线程操作
C#高级语法——多线程操作
线程概述
众所周知,我们在操作系统上运行的一个程序就是一个进程,一个进程中可能有多个线程在工作,而线程就是操作系统分配处理时间的基本单元,下面我给大家介绍一下多线程的一些简介和操作。
1、 用户及交互的软件需要尽可能快地对用户的操作作出反应,以便提供良好的用户体验,同时它又必须执行必要的计算机算法将数据呈现给用户,这时可以使用多线程来实现。
2、 多线程的优点:
(1) 要提高程序的响应速度,使用多线程是一种有效的方式,在只有一个处理器的电脑上,多线程可以通过利用用户事件间很小的间段在后台处理数据达到这种效果。
(2) 优点:
①执行占用大量时间的操作。
②执行具有不同优先级的任务。
③使用户界面可以在将时间片分配给后台任务时仍能快速地做出响应。
3、 使用多线程有好处也有坏处,一般不建议在程序中过多地使用线程,这样可以最大限
地减少系统资源的利用,提高性能。
4、 使用多线程的缺点:
(1) 缺点:
①可创建的进程和线程的数目受到系统可用内存的限制。
②跟踪大量线程将占用大量的处理时间,如果线程过多,则其中大部分线程都不会产生明显的进度。如果大多数线程处于同一个进程中,则其他进程中的线程的调度效率就会很低
③使用多个线程控制代码执行非常复杂,并可能产许多bug
④摧毁线程需要了解可能发生的问题并进行处理。
线程的操作以及实现
1、 创建线程我们常用Thread类的构造函数。
2、 线程类Thread常用的方法、
Abort 终止线程
Join 阻塞调用线程,直到某个线程终止或过了指定的时间为止
Sleep 将当前线程挂起/阻塞指定时间
Start 开始执行线程
SpinWait 导致线程等待由iterations参数定义的时间量
3、 创建Thread对象,线程对象已存在并配置,但并未创建线程,只有当调用Start 方法后线程才会被创建。下面通过一个例子来熟悉一下线程的操作方法吧。
(1) 龟兔赛跑是众所周知的一则寓言故事,敏捷的兔子因为骄傲自负在终点前睡了一个懒觉儿输给了踏实有毅力的乌龟,下面通过线程来实现这样的一个比赛.
(2) 窗体布局,首先我们先在vs2017创建一个WindowsFrom 窗体应用程序,然后往窗体中添加连个Listview 控件 用来显示乌龟和兔子的比赛过程,以及一个Button 按钮,用来控制比赛的开始,如图。
(2) 接下来就是写后台的控制代码了。
①我们在后台写两个方法,分别表示乌龟和兔子的比赛情况,代码如下
下面展示一些 内联代码片
。
//定义两个线程 th3 th4 分别用来实现乌龟和兔子的比赛过程控制
Thread th3, th4
//开始比赛按钮
private void button2_Click(object sender, EventArgs e)
{
//实例H化线程th3 乌龟
th3 = new Thread(new ThreadStart(tortoise));
//实例化线程th4 兔子
th4 = new Thread(new ThreadStart(rabit));
//开始线程
th3.Start();
//开始线程
th4.Start();
}
//乌龟记录
void tortoise()
{
//声明一个变量 跑了meter 米
int meter = 0;
while (meter<100)
{
//乌龟每秒 10米
meter += 10;
//线程休眠1000毫秒
Thread.Sleep(1000);
//每次循环往ListView 中添加比赛的过程
listView2.Items.Add("乌龟跑了:" + meter.ToString());
}
}
//兔子的比赛过程
void rabit()
{
//声明一个变量接收 兔子走过的路程
int meter = 0;
while (meter <100)
{
//兔子的速度 是每秒20米
meter += 10;
//Thead休眠 500毫秒
Thread.Sleep(500);
//向ListView中追加比赛过程
listView3.Items.Add("兔子跑了:" + meter.ToString());
//当兔子跑了80米后兔子在睡觉
if (meter==80)
{
listView2.Items.Add("兔子在睡觉!");
//乌龟的线程插入,兔子的线程被阻塞,知道乌龟的线程结束后兔子的线程才能继续
th3.Join();
}
}
}
(3) 运行结果如图,
4、 线程也有有效级别
(1) 线程的优先级别是相对而言的,是一个线程的相对于另一个线程的相对优先级别,每个线程在公共语言运行库中最常分配为Normal优先级;通过设置线程优先级别我们可以改变线程的调度优先级
(2) 线程的优先级别我们也可以通过人为的设置它的属性来改变线程的优先级别,它拥有以下属性。
Above 可以将Thread安排在具有Highest优先级的线程之后,具有Normal 优先级的线程之前
BrlowNormal 可以将T hread安排在具有Normal 优先级的线程之后,具有Lowest 优先级之前
Highest 可以将Thread 安排在具有任何优先级别的线程之前
Lowest 可以将Thread 安排在任何其他优先级别的线程之后
Normal 可以将Thread 安排在AboveNormal优先级别之后,在具有BelowNormal之前,默认情况下线程具有Normal优先级
代码如下
下面展示一些 内联代码片
。
th3.Priority = ThreadPriority.Lowest; //设置优先级别最低
th4.Priority = ThreadPriority.Highest; //设置优先级别最高