当前位置: 首页 > article >正文

C#笔记10 Thread类怎么终止(Abort)和阻止(Join)线程

Thread类

C#笔记8 线程是什么?多线程怎么实现和操作?-CSDN博客

C#笔记9 对线程Thread的万字解读 小小多线程直接拿下!-CSDN博客

上次说过怎么简单的使用多线程,怎么创建多线程,但是没有具体分析它的终止和释放。

线程的终止

Abort方法

英文意为终止,该方法用于终止线程:

它的方法是引发一个异常,从而跳到终结线程的过程。

在我们的.Net8.0平台,这也是个过时的方法。

  Thread myThread = new Thread(mythreaddo);
  chattx.Text += "\nthread start";
  myThread.Start();

  chattx.Text += "\nthread suspend";
  // 挂起线程
  myThread.Suspend();

  chattx.Text += "\nmainthreadsleep start" + DateTime.Now.ToString();
  // 等待一段时间或执行其他操作
  Thread.Sleep(1000);

  chattx.Text += "\nmainthreadsleep over" + DateTime.Now.ToString();
  // 恢复线程
  myThread.Resume();

  myThread.Abort();
  myThread.Start();

事实上在线程abort之后就不能再次启动了。如果你执行start方法会导致它报错。

此方法其实也有重载。

public void Abort(Object stateInfo);

    public void Abort(object stateInfo)
    {
        AbortReason = stateInfo;
        AbortInternal();
    }

 传入的参数作为终止的异常信息,可以被正在终止的线程使用。

using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread newThread  = new Thread(new ThreadStart(TestMethod));
        newThread.Start();
        Thread.Sleep(1000);

        // Abort newThread.
        Console.WriteLine("Main aborting new thread.");
        newThread.Abort("Information from Main.");

        // Wait for the thread to terminate.
        newThread.Join();
        Console.WriteLine("New thread terminated - Main exiting.");
    }

    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console.WriteLine("New thread running.");
                Thread.Sleep(1000);
            }
        }
        catch(ThreadAbortException abortException)
        {
            Console.WriteLine((string)abortException.ExceptionState);
        }
    }
}

但是在我们的.Net Framework 4.7.2也就是我们的winform的C#7.3中,此代码输出结果不太一样,而且join会影响我们的界面线程导致我们的数据无法输出。

这里我们就先不探究,只要知道怎么使用Abort方法即可。

Join()方法

此方法用于阻止调用线程,直到某个线程终止为止。意思是让当前线程等待另外一个线程执行完毕。

怎么理解呢:

它有三种重载:

Join()	
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止。

Join(Int32)	
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止或经过了指定时间为止。

Join(TimeSpan)	
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止或经过了指定时间为止。

 示例代码

static void Main()
    {
        Thread myThread = new Thread(DoWork);
        myThread.Start();

        // 等待线程完成
        myThread.Join();
    }

    static void DoWork()
    {
        // 执行线程任务
        Thread.Sleep(1000); // 假设线程需要1秒来完成工作
    }

在这个例子中,我们创建了一个名为 myThread 的线程,并启动了它。我们使用 myThread.Join() 方法等待 myThread 完成其任务。只有当 myThread 完成其工作或被终止时,Join 方法才会返回。

​永远不要从当前 Join 线程调用 表示当前线程的 对象的 方法 Thread 。 这会导致应用无响应,因为当前线程无限期地等待自身,

join方法的重载和sleep一样支持int32和timespan。都是用来表示等待的最大时间。


http://www.kler.cn/a/306217.html

相关文章:

  • C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用
  • Java:解决因为大小写不规范导致的接收不到数据
  • java的JJWT 0.91在jdk21中报错的解决方法
  • 【算法一周目】双指针(2)
  • 虚幻引擎 CEO 谈元宇宙:发展、策略与布局
  • 相机光学(四十二)——sony的HDR技术
  • SQLite的入门级项目学习记录(四)
  • [项目][WebServer][Task]详细讲解
  • python绘制3d建筑
  • flask-sqlalchemy的模型类两个表,既有一对一又有一对多的情况时,解决方法
  • SAP HCM HR_ABS_ATT_TIMES_AT_ENTRY 跨夜班不生效问题
  • 【MyBatis精讲】从入门到精通的详细指南:简化Java持久层操作的艺术
  • 开源 AI 智能名片小程序:开启内容营销新境界
  • Harmony Next 文件命令操作(发送、读取、媒体文件查询)
  • 【最佳实践】配置类封装-Async异步注解以及自定义线程池
  • 对操作系统(OS)管理和进程的理解
  • 28 线性表 · 栈
  • golang的GC(三色标记法+混合写屏障)学习笔记
  • 第一篇---滑动窗口最大值、前 K 个高频元素
  • 初识爬虫2
  • Linux删除SSH生成的密钥对
  • 探索Python的Excel世界:openpyxl的魔法之旅
  • 【homebrew安装】踩坑爬坑教程
  • 路由策略原理与配置
  • C#笔记11 获取线程及其信息,什么是优先级、单元状态、线程状态、执行状态、线程名称以及其他属性?
  • 一文速通calcite结合flink理解SQL从文本变成执行计划详细过程