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

相关推荐
三天不学习3 分钟前
C# 中的记录类型简介 【代码之美系列】
后端·c#·微软技术·record·记录类型
Artistation Game26 分钟前
一、c#基础
游戏·unity·c#·游戏引擎
cwtlw1 小时前
CSS学习记录20
前端·css·笔记·学习
虾稿1 小时前
[手机Linux] 七,NextCloud优化设置
linux·运维·服务器
chen_2271 小时前
kanzi3.6.10 窗口插件-查找绑定信息
c#·kanzi
数据小小爬虫1 小时前
Python爬虫获取AliExpress商品详情
开发语言·爬虫·python
首发运维1 小时前
centos 释放系统预留内存并关闭Kdump服务
linux·运维·centos·linux操作系统问题
小爬虫程序猿1 小时前
利用Python爬虫速卖通按关键字搜索AliExpress商品
开发语言·爬虫·python
一朵好运莲1 小时前
React引入Echart水球图
开发语言·javascript·ecmascript
新子-存在了1 小时前
linux中 mysql备份
linux·运维·mysql