`

C#多线程学习笔记之(abort与join配合使用)

 
阅读更多
今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动

这段代码非常好懂,但是有一点我不懂的是我以前一直认为abort()方法会使线程终止,为什么还要调用线程t的join方法呢?官方给的解释是abort():以开始终止此线程的过程,调用此方法通常会终止此线程,join():阻止调用某个线程,直到某个线程终止为止。当时死都想不通这两句话,直到把t.IsAlive(表示当前线程的执行状态)和t.ThreadState(该值包含线程的状态)打印出来后再想明白,现在先看看上面代码的运行结果:

奇怪,为什么线程abort()后isalive执行状态还是为TRUE呢,再看线程状态为AbortRequested,这意思是说线程已调用abort,但线程还未停止,于是再想想线程没停止,isalive属性为TRUE就变得合理了,那下面TRY语句块内再对线程重启就会产生错误了,都没停止何来产生重启呢?

但是问题还没有解决,如何才能让线程终止呢,难道abort不能让纯种终止吗?好了,先不要想那么多,我们把上述代码中t.join()注释符号给去掉,再来运行一下程序,结果如下:

好了,现在看看执行关态和线程状态我们得知线程终止了,而我们知道,当一个线程再调用abort()后是不能再start()了,所以同样会抛出异常,执行catch语句。综合两种情况来看,开始我还以为,难道只用abort()不用join()就不能终止线程吗?但是再对着两种结果和两个方法给出的介绍仔细想想就不难得出以下结论:
1.abort()的功能是用来终止调用此方法的线程的,只是在多数情况下,它需要一点时间,有些延迟(可能在短时间内此线程还在执行)...
2.join()方法它的功能不是终止线程,而是在t线程终止之前,阻止正在结束(调用了abort()方法但还未结束)的t线程执行,同时使主线程等待,直到t线程终止(也就是abort()方法终止过程完毕)了再执行下面的代码,打印出来的结果,执行状态就为FALSE,线程状态也为停止了


注意:在没有调用JOIN方法前,这段代码的执行结果可能为图中两种结果,都会存在,这可能根据电脑的不同,abort()执行时间有关,所以,这里join保证了我们在执行下面的代码时,t线程实现了“真正”的终止,我想这就是join用在abort()后的妙处吧!

分享到:
评论

相关推荐

    C# 多线程教材

    创建和开始使用多线程 线程同步基础 同步要领 锁和线程安全 Interrupt 和 Abort 线程状态 等待句柄 同步环境 使用多线程 单元模式和Windows Forms BackgroundWorker类 ReaderWriterLock类 线程池 异步委托 计时器 ...

    c# Winform 弹出式等待窗口,多线程

    网上有好多使用多线程弹出式等待窗口作为程序中较长时间后台运行提示的,但是做的都不完善,尤其是用 waitThread.Abort() 杀死线程时容易产生异常,进而出错。本程序是比较完善的改进,利用多线程弹出等待窗口,并...

    C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called

    C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called. C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called.

    C#多线程之线程控制详解

    本文为大家分享了C#多线程之线程控制,供大家参考,具体内容如下 方案一: 调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume(); private void btn_Start_...

    c#多线程抓取网页内容

    多线程在C#中并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。 要开启一个新线程,需要以下的初始化: ThreadStart startDownload = new ThreadStart( DownLoad ); //线程起始设置:即每个...

    C#基于异步事件回调多线程容器

    多线程应该采用消息中心来交换数据,这样就规避了线程同步交互,等待,阻塞等等,全部是异步调用,全部是接收消息工作,然后产生消息,线程间没有耦合,消息中心有很多成熟的方案如RabbitMQ, Redis(里面有简单的...

    c#线程和图形的结合

    实现一个线程结合图形按钮的例子, 方法Start():建立线程类对象后,线程并不能自动运行,用这个方法启动线程。方法IsAlive():判断线程对象是否存在,=true,存在。方法Abort():撤销线程对象。不能撤销一个已不...

    浅谈C#多线程简单例子讲解

    因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。 a.启动线程 顾名思义,“启动线程”就是新建并启动一个线程的意思,如下代码可实现: Thread thread1 = new Thread(new ThreadStart...

    .net c#线程超时解决方案

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    .net C#线程超时

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    初探c#初探c#初探c#初探c#初探c#初探c#

    因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。 即使你没有编写多线程应用程序的经验,也可能听说过“启动线程”“杀死线程”这些词,其实除了这两个外,涉及多线程方面的还有诸如...

    C#.net同步异步SOCKET通讯和多线程总结

    服务端: using System.Net;...// 清理所有正在使用的资源。 protected override void Dispose( bool disposing ) { try  {  socket.Close();//释放资源  mythread.Abort ( ) ;//中止线程  }  catch{ }

    C#中的线程(二)线程同步

    线程同步基础 同步要领 锁和线程安全 Interrupt 和 Abort 线程状态 等待句柄 同步环境

    C#实现终止正在执行的线程

    一般来说,很多人都会使用Abort方法来终止线程,其实这种做法并不可取!如果你的线程正在操作临界资源,很有可能会造成资源没有正确释放而出现死锁问题。正确的做法应该是使用标记来终止线程的执行。 基本思路是:...

    threading in C# - C#线程

    threading in C# Part 1 Getting Started Overview and Concepts ............................................................................................................. 3 How Threading Works .......

    一个多线程断点上传文件的功能

    用多线程实现断点上传的功能 DeleteOverThread(); #region 初始化 string backUploadStatus = dr["BACKEND_UPLOAD_STATUS"].ToString(); //是否上传成功或取消 if (backUploadStatus == Status.Upload_...

    线程外部挂起恢复控制(不使用Suspend与Resume中止线程)

    本人利用Thread.Abort()与Thread.Interrupt()可以引起目标线程异常的特点,开发了一种不使用已过时的方法来变相从外部控制线程的挂起与恢复的技术,原理简单,方便理解。 相关技术参考:...

    C#例子代码 A0301_ThreadAbort

    C#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#...

    用U盘装系统出现“Decompression error,Abort“

    使用U盘装系统过程中,中途突然弹出错误警告:“Decompressionerror,Abort“,出现这种情况一般是由U盘与电脑USB接口松动或是U盘中的系统映像文件损坏导致,可以重新插拔U盘,换个系统文件试试。 本文来源于:u大师...

    Software caused connection abort: recv failed

    Software caused connection abort: recv failed

Global site tag (gtag.js) - Google Analytics