转载 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程。
1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程。
2,进程和线程的关系:
A,进程,包含程序运行所需要的资源 ,在大多数情况下是指 程序。(商店:囤积要使用的资源的地方)
B,线程,是在进程中能够被CPU调用的程序单元,是提供给CPU运行程序的代码片段。(商店员工:是运行程序的行动者)
C,一个进程至少一个线程,每一个线程有自己专属的寄存器(栈指针、程序计数器等)但代码区是共享的,不同的线程可以执行同样的函数
D,同一进程中的多个线程之间可以“并发”执行

3,多线程的目的:
A,让CPU主动执行不同的程序单元,这样就不至于被某个程序的恶意代码引起死机症状
B,让计算机“同时”做多个事情,节约时间
C,CPU在不同的线程里面切换,在不同的进程里面切换
5,线程的调度方式:
A,非抢占式调度:是指某个线程在运行的过程中不会被操作系统强制性暂停,线程可以一直运行到告一段落或者主动交出运行权。线程的运行完全是单队列的(像排序买票一样),这样可能产生恶意程序长期霸占运行权的情况,而且一旦一个程序死掉了,电脑只能重启了。
B,抢占式调度:每个线程有极少的运行时间(在Windows内核模式下这个时间不会超过20ms),当时间用完的时候线程就会被强制暂停,保存上下文并把CPU的运行权交给下一个线程,这样调度的结果就是所有的线程都在被快速的切换运行,这样给客户端的感觉就是线程在“并行同时” 运行。
C, 线程的调用由CPU决定,所以调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。

6,线程切换的时候保存线程当前的执行状态,也就是线程当前的执行会话
线程中的寄存器存在当前执行的代码号,堆栈存储当前运行的变量的值。当CPU执行再次回到这个线程的时候读取之前寄存器和堆栈中保存的数据。
程序代码,编译以后是CPU的指令集,CPU对指定集执行只读操作。 如下图:

7,如何实现多线程?
A, 编写产生线程需要执行的方法
B,引用System.Threading命名空间
C,实例化Thread类,并传入一个指向线程所需要运行方法的委托(线程已经产生,还没有开始运行)
D,调用Tread实例的Start方法,标记该线程可以被CPU执行了(具体执行时间由CPU决定)

/// <summary>
/// 多线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnThread_Click(object sender, EventArgs e)
{
//1,创建线程并通过委托语法糖 传入方法
Thread thrSon = new Thread(CountDo);
//2,设置为后台线程
thrSon.IsBackground = true;
//3,启动线程
thrSon.Start();
} void CountDo()
{
int i = 0;
while (true)
{
if (i < 999999999)
{
i++;
}
else
{
break;
}
}
MessageBox.Show("计算完毕:" + i);
}

8,线程到底是什么?
线程是存储单元,是存储在内存中的空间,存储的是任务列表,要去做什么事情!这些任务交给CPU去做。CPU决定什么时候去做。
线程是帮助CPU完成抢断式执行的基础数据类型,用来存储CPU每次执行未完成时需要保存的代码执行信息。(如:正在执行哪个方法?执行到第几行了?方法里的变量值为什么?)
9,Thread类的一些重要成员
- Start()启动线程
- Abort()终止线程
- Thread.Sleep(100)静态方法,可以让当前线程停止一段时间运行(毫秒)
- Name线程名
- Thread.CurrentThread获得当前线程的引用
- 前台线程 和 后台线程
10,多线程的消耗
线程之间切换需要保存当前执行状态,以及读取切换前的执行状态,这个多线程的消耗。
转载 【.NET基础】--委托、事件、线程(3)的更多相关文章
- [ 转载 ] Java基础14--创建线程的两个方法
http://www.cnblogs.com/whgw/archive/2011/10/03/2198506.html Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类 ...
- 转载:C#中事件和委托的编译代码
接上文转载:C#中事件的由来,这时候,我们注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误: public event Gr ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- c#基础学习笔记-----------委托事件
这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...
- C# 基础 - 委托、事件
1. 委托 sequenceDiagram 方法->>委托: 返回值和入参一样 委托->>方法: 调用委托就是调用绑定的方法 delegate int NumTest(int ...
- [.net 面向对象编程基础] (22) 事件
[.net 面向对象编程基础] (22) 事件 事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是. ...
- C# ~ 从 委托事件 到 观察者模式 - Observer
委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...
- 谈.Net委托与线程——解决窗体假死
转自:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html#2457370 引言 在之前的<创建无阻塞的异步调用> ...
- C#基础知识回顾--线程传参
C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...
- c#委托事件入门--第二讲:事件入门
上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...
随机推荐
- 所生成项目的处理器架构“MSIL”与引用“Microsoft.AspNet.Scaffolding.12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86”的处理器架构“x86”不匹配。
生成成功后: 3>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): ...
- MVC架构介绍-Model的开发
需要在派生类实现lEntity,IEntity的两个属性EntityId和IsDeleteInDataBase,以显式方式实现 Model的所有属性存入数据库以前都要确保有相应的默认值,不要依赖数据库 ...
- [Laravel] Laravel的基本使用
[Laravel] Laravel的基本HTTP路由 使用Laravel的基本路由,实现get请求响应,找到文件app/Http/routes.php 调用Route的静态方法get(),实现get响 ...
- spring事务传播行为之使用REQUIRES_NEW不回滚
最近写spring事务时用到REQUIRES_NEW遇到一些不回滚的问题,所以就记录一下. 场景1:在一个服务层里面方法1和方法2都加上事务,其中方法二设置上propagation=Propagati ...
- Rarely executed and almost empty if statement drastically reduces performance in C++
Question: Editor's clarification: When this was originally posted, there were two issues: Test perfo ...
- C# 特性学习笔记
1.自己定义的特性 注意注释!!!!! 2.使用特性 3.特性的用处
- Flash饼状图统计代码
index.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- ajax小知识
1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...
- Mobile First! Wijmo 5 之 架构
CSDN移动开发频道率先报道的<Mobile First!jQuery UI组件集Wijmo五年最大更新>引起开发者极大关注. 本文就开发者关心的话题之一架构,展开叙述. Wijmo 5是 ...
- matlab练习程序(高斯牛顿法最优化)
计算步骤如下: 图片来自<视觉slam十四讲>6.2.2节. 下面使用书中的练习y=exp(a*x^2+b*x+c)+w这个模型验证一下,其中w为噪声,a.b.c为待解算系数. 代码如下: ...