『C#基础』多线程笔记「一」基本说明
2012-03-23 12:03
330 查看
基本概念:
参考:
http://msdn.microsoft.com/zh-cn/library/ms173178(v=vs.100).aspx 「MSDN线程处理」
http://msdn.microsoft.com/zh-cn/library/e1dx6b2h.aspx 「MSDN使用线程」
/article/5056436.html
http://kb.cnblogs.com/page/42528/
/article/4992624.html 「STAThread的含义」
一个程序集一个进程 一个进程可以有多个线程,且属于同一个程序集 每一个线程可以视为一个执行流,每一个执行流用于执行一个特定的任务 各个线程的执行是独立的 每个程序集都要有一个主线程 线程使程序能够执行并发处理 线程共享应用程序的资源 线程处理解决了吞吐量和响应性的问题
一般用途: 可以使用线程处理来监视用户输入,执行后台任务,以及处理并发输入流 辅助线程经常用在服务器应用程序中,以便无需等待前面的请求完成即可响应传入的请求 辅助线程可用于在桌面应用程序中执行“后台”任务,使主线程(用于驱动用户界面元素)保持对用户操作的响应 可以用于执行耗时较多的任务或时间要求紧迫的任务,而不必占用主线程
使用好处: 多线程可以提高CPU的利用率,因为当一个线程处于等待状态的时候,CPU会去执行另外的线程 提高了CPU的利用率,就可以直接提高程序的整体执行速度
使用坏处: 线程开的越多,内存占用越大 协调和管理代码的难度加大,需要CPU时间跟踪线程 线程之间对资源的共享可能会产生可不遇知的问题
几个原则: 尽量少用多线程,而且使用多线程并不意味着程序有多么的高级 使用辅助线程执行不需要大量占用其他线程所使用的资源的、耗时较多的任务或时间要求紧迫的任务 在有需要等待的任务时,可以考虑使用多线程,以提高程序运行的效率 在线程结束时,可以考虑手工释放内存与资源,而不是等待垃圾回收器 尽量避免使用公共资源,以减少数据冲突的可能 对每个线程的运行都要严格监控
几个说明: 主要的命名空间:System.Threading 、System.Threading.Tasks 主要使用的方法:threadObject.Start()、threadObject.Join()、threadObject.Sleep(<毫秒>)、threadObject.Abort()、threadObject.Suspend()、threadObject.Resume() 实例化一个线程对象,需要使用某一个实例的方法作为传入参数 可以使用Thread.CurrentThread来设置当前线程的一些属性(如:名称等)
操纵线程: 创建线程:线程在实例化的时候,需要传递一个ThreadStart委托或ParameterizedThreadStart委托(我在式样代码中直接就传了个方法…),传入的委托要包含新线程调用的方法。
启动线程:使用Start()方法来启动某一个线程对象(调用Start方法之后,并不一定马上就会执行线程中的方法,因为线程的执行是伪并发的),且不可以重复调用某一线程对象的Start方法,不然会引发异常(ThreadStartException)。一旦调用Start方法之后,就不必保持对线程对象的引用了,这个线程会一直执行,直到结束。
传递数据:可以给被调用的类的构造函数作一定的处理,用于接收初始化数据。还可以在初始化的时候,传入一个委托对象,用于接收回调方法。
休眠:线程可以通过Sleep方法来进行休眠,这样就可以在休眠的时间段内,把资源让给其他线程去执行。
中断线程:所谓的中断,不是指中断线程的执行(中断执行可以使用Sleep方法),而是指中断等待状态。可以使用Interrupt执行中断休眠等待操作,如果此时线程正处于休眠等待状态,则引发一个异常ThreadInterruptException,我们可以针对这个异常进行适当的操作。适当的处理这个方法,可以让线程脱离等待状态、让处理阻止线程执行的问题等。
销毁线程:我们可以使用Abort方法来永久性的停止一个线程(所谓的永久性,其实也是在被线程执行的方法中引发一个异常ThreadAbortException,然后通过捕获这个异常来进行一些操作,当然,我们也可以调用回当前的方法,从而实现永不可被手动销毁)。
线程调度:我们可以给线程的Priority属性设置值(优先级),从而实现对线程的调度。线程一共有五个优先级,从低到高为ThreadPriority.Lowest、ThreadPriority.BelowNormal、ThreadPriority.Normal、ThreadPriority.AboveNormal、ThreadPriority.Highest。
取消线程(NET 4.0 中加入):可以使用取消标记来取消线程。这个标记不是在Thread中内置的,而是通过使用ParameterizedThreadStart委托的Thread构造函数将一个标记传递给线程过程。
式样代码:启动线程:使用Start()方法来启动某一个线程对象(调用Start方法之后,并不一定马上就会执行线程中的方法,因为线程的执行是伪并发的),且不可以重复调用某一线程对象的Start方法,不然会引发异常(ThreadStartException)。一旦调用Start方法之后,就不必保持对线程对象的引用了,这个线程会一直执行,直到结束。
传递数据:可以给被调用的类的构造函数作一定的处理,用于接收初始化数据。还可以在初始化的时候,传入一个委托对象,用于接收回调方法。
休眠:线程可以通过Sleep方法来进行休眠,这样就可以在休眠的时间段内,把资源让给其他线程去执行。
中断线程:所谓的中断,不是指中断线程的执行(中断执行可以使用Sleep方法),而是指中断等待状态。可以使用Interrupt执行中断休眠等待操作,如果此时线程正处于休眠等待状态,则引发一个异常ThreadInterruptException,我们可以针对这个异常进行适当的操作。适当的处理这个方法,可以让线程脱离等待状态、让处理阻止线程执行的问题等。
销毁线程:我们可以使用Abort方法来永久性的停止一个线程(所谓的永久性,其实也是在被线程执行的方法中引发一个异常ThreadAbortException,然后通过捕获这个异常来进行一些操作,当然,我们也可以调用回当前的方法,从而实现永不可被手动销毁)。
线程调度:我们可以给线程的Priority属性设置值(优先级),从而实现对线程的调度。线程一共有五个优先级,从低到高为ThreadPriority.Lowest、ThreadPriority.BelowNormal、ThreadPriority.Normal、ThreadPriority.AboveNormal、ThreadPriority.Highest。
取消线程(NET 4.0 中加入):可以使用取消标记来取消线程。这个标记不是在Thread中内置的,而是通过使用ParameterizedThreadStart委托的Thread构造函数将一个标记传递给线程过程。
带回调的被操作类using System; using System.Threading; namespace csdemo.basic.ThreadsDemo { public class WorkerClass { #region 属性 public string WorkerName = "No One"; public string WorkName = "not working"; public int Times = 10000; ExampleCallback callback; // 用于控制线程的停止 private bool _threadStop = false; // 用于控制另一个线程的Join操作 private bool isOtherJoined = false; private Thread otherThread = null; #endregion #region 构造函数 public WorkerClass() { this.WorkerName = "No One"; this.WorkName = "not working"; this.Times = 10000; } public WorkerClass(string workerName,string workName,int times,ExampleCallback callbackDelegate) { this.WorkerName = workerName; this.WorkName = workName; // 回调方法的委托 this.callback = callbackDelegate; } #endregion // 传入线程的方法 public void Do() { Console.WriteLine("Worker thread is started."); for (int i = 1; i <= Times; i++) { if (_threadStop == true) break; if (isOtherJoined == true) otherThread.Join(); // 回调方法,表面上看是调用一个委托 // 实质上返回的数据为当前的输出次数 if (callback != null) callback(i); // Console.WriteLine("{0} is {1} now!", WorkerName, WorkName); Thread.Sleep(1000); } Console.WriteLine("Worker thread is complete."); } #region 其他操作 /// <summary> /// 这个操作是用于停止线程调用的对象方法的分行; /// 通过在实调用对象中,创建一个bool类型的变量来监视停止状态; /// 在主线程中,通过设置辅助线程的监视变量的值来控制线程的停止行为; /// 需要注意的是,这种方法只能够用于停止线程的执行,而无法让被停止的线程继续执行。 /// </summary> internal void RequestStop() { Console.WriteLine("{0} Thread: Force stoped"); _threadStop = true; } /// <summary> /// 强行执行一个线程,直到结束为止; /// 这个操作会阻塞其他在当前里程中执行的线程,也就是说让当前进程中的其他线程都给这个线程让路; /// /// 由于Thread是使用方法作为实例化方法的,所以还是要在操作类中加入一个bool类型的变量来控制另一个线程的Join操作; /// </summary> /// <param name="thread">要Join入当前线程的另一个线程对象</param> internal void RequestJoin(Thread thread) { Console.WriteLine("{0} Thread: {1} joined!",this.WorkerName,thread.Name); this.otherThread = thread; isOtherJoined = true; } #endregion } }
参考:
http://msdn.microsoft.com/zh-cn/library/ms173178(v=vs.100).aspx 「MSDN线程处理」
http://msdn.microsoft.com/zh-cn/library/e1dx6b2h.aspx 「MSDN使用线程」
/article/5056436.html
http://kb.cnblogs.com/page/42528/
/article/4992624.html 「STAThread的含义」
相关文章推荐
- 『C#基础』多线程笔记「一」基本说明
- 黑马程序员---C#多线程基础笔记
- 『C#基础』多线程笔记「三」计时器
- 『C#基础』多线程笔记「三」计时器
- 『C#基础』多线程笔记「二」线程同步
- 『C#基础』多线程笔记「二」线程同步
- 『C#基础』多线程笔记「三」计时器
- 『C#基础』多线程笔记「四」线程池
- Linux程序设计学习笔记----多线程编程基础概念与基本操作
- IOS学习笔记 多线程基本理论基础(1)
- 02-C#(基础)基本的定义和说明
- 『C#基础』多线程笔记「二」线程同步
- 『C#基础』多线程笔记「四」线程池
- c# 多线程学习笔记 (一)基本概念
- .NET基础笔记(C#)
- Java学习笔记【多线程基本知识】
- Java基础知识强化之多线程笔记03:进程与线程 和 多线程的意义
- linux笔记:shell基础和bash的基本功能
- C#基础系列:反射笔记
- 2012-04-03 C#基础学习笔记(3)