什么是进程?
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资
源。而一个进程又是由多个线程所组成的。
什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区
是共享的,即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任
务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
可以提高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;
}
资料:
如果你的进程没有响应的时候可以看一下这篇 http://www.cnblogs.com/killmyday/articles/1394467.html