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。都是用来表示等待的最大时间。

相关推荐
无奈笑天下12 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
大可不必了14 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus14 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道15 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛15 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件16 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿16 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
eggwyw16 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
楚山之石17 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri