什么是进程?


当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资

源。而一个进程又是由多个线程所组成的。

什么是线程?


线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区

是共享的,即不同的线程可以执行同样的函数。

什么是多线程?


多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任

务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处:


可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不

是等待,这样就大大提高了程序的效率。

多线程的不利方面: 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;

接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程

的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停

下来,以便看清楚执行过程中的输出。
DoNET提供了那些控件或类来操作线程?

线程操作在 System.Threading 命名空间下

Thread类有几个至关重要的方法,描述如下:
Start():启动线程;
Sleep(int):静态方法,暂停当前线程指定的毫秒数;
Abort():通常使用该方法来终止一个线程;
Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复;
Resume():恢复被Suspend()方法挂起的线程的执行;

Thread.ThreadState 属性

这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程。
ThreadState 属性的取值如下:
Aborted:线程已停止;
AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止;
Background:线程在后台执行,与属性Thread.IsBackground有关;
Running:线程正在正常运行;
Stopped:线程已经被停止;
StopRequested:线程正在被要求停止;
Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行);
SuspendRequested:线程正在要求被挂起,但是未来得及响应;
Unstarted:未调用Thread.Start()开始线程的运行;
WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态;

线程的优先级

当线程之间争夺CPU时间时,CPU 是按照线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal

给一个线程指定优先级,我们可以使用如下代码:
//设定优先级为最低
myThread.Priority=ThreadPriority.Lowest;

互斥对象 Mutex类 和lock关键字,

AutoResetEvent 信号灯

Monitor监视器

ThreadPool线程池

。NET多线程 (BackgroundWorker组件使用说明)

一.            概述

BackgroundWorker是·NET 2.0提供的一个多线程组件,在应用程序中使用,可以非常简单方便地实现UI控件通信,并自动处理多线程冲突问题。

二.            基本属性

1.      WorkerReportsProgress ,bool:是否允许报告进度;

2.      WorkerSupportsCancellation,bool:是否允许取消线程。

3.      CancellationPending,bool,get:读取用户是否取消该线程。

三.            基本事件

1.      DoWork:工作者线程

2.      RunWorkerCompleted :线程进度报告

3.      ProgressChanged:线程结束报告

四.            基本方法

1.      RunWorkerAsync() :启动工作者线程;

2.      CancelAsync():取消工作者线程;

3.      ReportProgress(int);   报告进度

五.      代码

//启动

private void btnStart_Click(object sender, EventArgs e)

{

this.btnStart.Enabled = false;

this.btnStop.Enabled = true;

this.backgroundWorker.RunWorkerAsync();

}

//通知线程停止

private void btnStop_Click(object sender, EventArgs e)

{

this.backgroundWorker.CancelAsync();

}

//工作者线程

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)

{

for (int i = 0; i < 150; i++)

{

if (backgroundWorker.CancellationPending)   //查看用户是否取消该线程

{

break;

}

System.Threading.Thread.Sleep(50);          //干点实际的事

backgroundWorker.ReportProgress(i);         //报告进度

}

}

//线程进度报告

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

this.progressBar1.Value = e.ProgressPercentage * 100 / 150;

}

//线程结束报告

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

this.btnStart.Enabled = true;

this.btnStop.Enabled = false;

}

资料:

C#多线程教程

权威.NET多线程详解(源码示例) 权威.NET多线程详解(源码示例)

如果你的进程没有响应的时候可以看一下这篇 http://www.cnblogs.com/killmyday/articles/1394467.html

C# 多线程 学习相关推荐

  1. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  2. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  3. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  4. C# 多线程学习总结

    C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程? 线程是 ...

  5. C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...

  6. 多线程学习-基础(四)常用函数说明:sleep-join-yield

    一.常用函数的使用 (1)Thread.sleep(long millis):在指定的毫秒内让当前正在执行的线程休眠(暂停执行),休眠时不会释放当前所持有的对象的锁. (2)join():主线程等待子 ...

  7. C#多线程学习之(五)使用定时器进行多线程的自动管理

    本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...

  8. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  9. C#多线程学习(三) 生产者和消费者

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

  10. C#多线程学习(五) 多线程的自动管理(定时器) (转载系列)——继续搜索引擎研究...

    Timer类:设置一个定时器,定时执行用户指定的函数.               定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer ...

最新文章

  1. 5、计算机图形学——着色与光照模型
  2. 处理字符数据--运算符和函数
  3. html文字置顶标签,HTML的marquee标签怎么用?
  4. 中如何移动物体在画面中的位置_组合柜摆在客厅中什么位置最旺运?客厅中,财位是如何确定的?...
  5. Apache Load Balance Using Haproxy
  6. 天猫超市回应“大数据杀熟”传言:系新人专享价未显示
  7. java string不为空_java如何正确判断String为空
  8. 处理机调度的概念、层次
  9. 基于PHPCMS的SQL注入(Havij)
  10. 什么是AWT_Swing_Scroll面板,上!!!
  11. jquery中单选选中及清除选中状态
  12. 海康设备插上移动硬盘,空间为0的解决办法
  13. CocosCreator学习示例合集v3.4.2
  14. Office 开发版本号与版本对应关系
  15. 基于SpringBoot+Thymeleaf兼职招聘网站
  16. 2020阿里云服务器购买攻略-618年中大促专场
  17. 牛逼的黑客也得找工作,他们靠的是黑掉公司网站?
  18. python多分支结构案例_python的程序控制结构-分支结构与身体质量指数案例--python-6-da...
  19. 小型网站组建(ENSP)
  20. STC8A单片机应用开发

热门文章

  1. matlab 样本均值,Matlab | Matlab从入门到放弃(4)——样本均值
  2. 去掉日志服务器性能,日志服务器及性能监控
  3. linux远程登录显示,SSH远程登录显示自定义警告信息
  4. mysql 自动 分库 备份_MySQL分库备份的方法
  5. Node.js ES6 模块化的基本语法-按需导出与按需导入
  6. Python Types
  7. MySQL Data Manipulation Statements
  8. C语言 gcc 静态库
  9. python语言能做什么游戏好玩_太好玩了我用 Python 制作一款小游戏
  10. vSAN Health Service-物理磁盘运行状况-物理磁盘运行状况检索问题(2149291)