C#多线程Thread类各状态与函数之间的关系分析测试

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43145361/article/details/100552856

前言

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() 方法。但是由于线程的运行是一般是受主线程管控的,所以不推荐在使用内部调用。

猜你喜欢

转载自blog.csdn.net/weixin_43145361/article/details/100552856