之前的两篇文章我们了解了委托和事件,本文我们看一下线程。

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 = ;
while (true)
{
if (i < )
{
i++;
}
else
{
break;
}
}
MessageBox.Show("计算完毕:" + i);
}

8,线程到底是什么?

  线程是存储单元,是存储在内存中的空间,存储的是任务列表,要去做什么事情!这些任务交给CPU去做。CPU决定什么时候去做。

  线程是帮助CPU完成抢断式执行的基础数据类型,用来存储CPU每次执行未完成时需要保存的代码执行信息。(如:正在执行哪个方法?执行到第几行了?方法里的变量值为什么?)

9,Thread类的一些重要成员

  • Start()启动线程
  • Abort()终止线程
  • Thread.Sleep(100)静态方法,可以让当前线程停止一段时间运行(毫秒)
  • Name线程名
  • Thread.CurrentThread获得当前线程的引用
  • 前台线程 和 后台线程

10,多线程的消耗

  线程之间切换需要保存当前执行状态,以及读取切换前的执行状态,这个多线程的消耗。

【.NET基础】--委托、事件、线程(3)的更多相关文章

  1. c#基础学习笔记-----------委托事件

    这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...

  2. C# 基础 - 委托、事件

    1. 委托 sequenceDiagram 方法->>委托: 返回值和入参一样 委托->>方法: 调用委托就是调用绑定的方法 delegate int NumTest(int ...

  3. [.net 面向对象编程基础] (22) 事件

    [.net 面向对象编程基础] (22)  事件 事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是. ...

  4. C# ~ 从 委托事件 到 观察者模式 - Observer

    委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...

  5. 谈.Net委托与线程——解决窗体假死

    转自:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html#2457370   引言 在之前的<创建无阻塞的异步调用> ...

  6. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  7. SQL Server 扩展事件(Extented Events)从入门到进阶(2)——在GUI中创建基础扩展事件

    本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 第一篇文章中提到了如何在Profiler中创建跟踪(trace),并以服务器端(server-side)跟 ...

  8. C#基础委托回顾

    C#基础委托回顾 前言 快忘记了. 委托的特点 委托类似于 C++ 函数指针,但它们是类型安全的. 委托允许将方法作为参数进行传递. 委托可用于定义回调方法. 委托可以链接在一起:例如,可以对一个事件 ...

  9. C#基础之事件(2)

    在“C#基础之事件(1)”中已对事件有了一个大概,这里对事件进行更深入的学习. 本节按以下内容展开: 1.事件拥有者与事件响应者的关系: 2.事件订阅的多种写法: 3.事件的订阅和取消订阅: 4.多事 ...

  10. C# 利用委托事件进行窗体间的传值(新手必看)

    引言: 窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体.然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ...

随机推荐

  1. javaScript-原型、继承-01

    为什么会有原型这个概念: 1.优雅的创建对象: 2.继承: 先看js 之前创建对象的方式存在的问题: 创建对象方式 1.字面量 var obj={name:"join",age:1 ...

  2. 史上最全APP推广渠道

    群主做App推广的过程中,有过失败也尝过成功的甜头,渐渐地在APP推广尤其是渠道推广中积累了一些实战经验想同大家分享.如果各位有更好的推广建议,欢迎沟通分享哦!   一.应用商店推广   1.应用市场 ...

  3. hdu 4859 海岸线 最小割

    海岸线 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 Description 欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能 ...

  4. ztree使用心得

    一个很好用的Jquery树形控件 官网:http://www.ztree.me/v3/main.php#_zTreeInfo 我主要引用的文件为: //最新版的JS压缩包 <script src ...

  5. C++ Code_ScrollBar

    主题 1.  ScrollBar的使用 2. 3. 4. 5.      属性 HScrollBar VScrollBar 直接拖拽1其中任意空间到对话框上面是,你一拖拽滚动条,它立即回到原始位置   ...

  6. poj 1941 The Sierpinski Fractal 递归

    //poj 1941 //sep9 #include <iostream> using namespace std; const int maxW=2048; const int maxH ...

  7. 2013 French Open Semifinal Press

    http://v.youku.com/v_show/id_XNTY4MTgzOTEy.html?firsttime=0 Novak, can you take any confirt   for qu ...

  8. HTML5 API——无刷新更新地址 history.pushState/replaceState 方法

    尽 管是上面讲到的<JavaScript高级程序设计>(第二版)中提到,BOM中的location.path/query…… (window.location)在通过JavaScript更 ...

  9. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  10. c#怎么把byte转化成int

    三种方法来进行转换.(1) 在.NET Framework类库的System名字空间中有个叫做BitConverter的类,它是专门用来进行这种转换的.主要方法:1> GetBytes()方法  ...