版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
前言
C#的多线程有多个状态和多个操作函数,本程序主要目的是为了测试C#中线程的主要状态和操作函数调用关联。
简介
基本概念
- Thread类的状态使用枚举型 ThreadState 进行表示,其中有多种状态,大部分都是不用的,本文只关注几个最常用的状态。
- ThreadState 状态可以叠加,比如在示例代码中,用
thread = new Thread(ThreadMain) { IsBackground = true };
初始化后,
thread
的状态是ThreadState.Background | ThreadState.Unstarted
。我们可以使用以下代码确认是否有某个状态:
if ((thread.ThreadState & ThreadState.WaitSleepJoin) == ThreadState.WaitSleepJoin)
,
更详细的枚举型的操作代码可以参考此文:【实用】超简单的基于枚举型使用1个字节表示8个权限的方法。 IsBackground
属性设置以后,如果主线程线束,则 thread 线程也会结束。为了防止主线程结束后,一些线程不停止,建议设置此属性为true
。
线程主要控制方法
Start()
开始一个线程;Suspend()
挂机当前线程,使之暂停工作;Resume()
恢复挂机的状态;About()
强制中止当前线程,使之不再工作。- 手工停止 为个人添加内容,通过一个变量来结束 While 死循环,从而结束线程。
线程主要状态及含义
- Unstarted:线程初始化后,尚未启动;
- WaitSleepJoin:正常运行状态(外部查看);
- Running:正常运行状态(内部查看);
- Suspended:已挂起;
- Abouted:强制中卡;
- Stopped:正常运行结束。
实验结论
- Thread 在用 new 初始化后状态中包括 ThreadState.Unstarted;
- 线程状态必需有 ThreadState.Unstarted 才可以调用 Start() 方法;
- 从线程内部和外部查看当前线程状态是不一样的。在示例中,从窗体主线程来看运行中的
thread
线程,显示的状态为ThreadState.WaitSleepJoin
;若是在thread
的线程内来看,则状态显示为ThreadState.Running
; - 线程状态必需有
ThreadState.WaitSleepJoin
才可以调用About()
和Suspend()
方法; - 线程状态必需有
ThreadState.Suspended
才可以调用Resume()
方法; - 线程正常运行完成后,线程状态为
ThreadState.Stopped
。 - 线程成功执行了
About()
方法后,线程状态为ThreadState.Abouted
状态。 - 以上方法的调用都是在外部调用的。在线程内部只能调用
About()
和Suspend()
方法。但是由于线程的运行是一般是受主线程管控的,所以不推荐在使用内部调用。