注意!你的Thread.Abort方法真的让线程结束了呢?

发布时间:2019-05-03  栏目:Python  评论:0 Comments

世家都掌握在C#中间,大家能够使用 Thread.Start方法来运维二个线程,当大家想结束试行的线程时方可利用Thread.Abort方法来强制甘休正在施行的线程,然而请小心,你规定调用了Thread.Abort方法后线程就立马停下了呢? 答案是:不是!

世家都了解在C#个中,大家能够运用 Thread.Start方法来运营2个线程,当大家想结束实践的线程时方可动用Thread.Abort方法来强制结束正在实行的线程,可是请小心,你规定调用了Thread.Abort方法后线程就立时停下了呢? 答案是:不是!

 

 

下边大家来解释一下Abort方法是什么样行事的。因为公用语言运维时管理了具备的托管的线程,同样它能在各类线程内抛出十分。Abort方法能在对象线程中抛出二个ThreadAbortException极度从而导致目的线程的终止。不过Abort方法被调用后,目的线程也许并不是登时就终止了。因为就算目的线程正在调用非托管的代码而且还不曾回去的话,该线程就不会立刻停下。而若是目的线程在调用非托管的代码而且陷入了2个死循环的话,该目的线程就根本不会终止。但是那种意况只是部分特例,越多的情景是目的线程在调用托管的代码,一旦Abort被调用那么该线程就应声停下了。

上面大家来解释一下Abort方法是哪些行事的。因为公用语言运营时管理了具有的托管的线程,一样它能在每一种线程内抛出分外。Abort方法能在对象线程中抛出1个ThreadAbortException非凡从而形成目标线程的安歇。然而Abort方法被调用后,目的线程或许并不是立即就停下了。因为只要目标线程正在调用非托管的代码而且还尚未重临的话,该线程就不会及时终止。而只要目标线程在调用非托管的代码而且陷入了3个死循环的话,该目的线程就根本不会甘休。可是那种情景只是有的特例,更加多的情状是目的线程在调用托管的代码,一旦Abort被调用那么该线程就随即停下了。

 

 

实际上多少个线程在运维时,我们得以经过Thread.ThreadState属性读出它的意况,正在运作的线程状态就是ThreadState.Running。然后假若我们想强制结束正在实行的线程,就能够调用Thread.Abort方法,然而Thread.Abort方法做的事情只是在线程上抛出了1个ThreadAbortException分外,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的演讲是:已对线程调用了 Thread.Abort
方法,但线程尚未接到试图安息它的挂起的System.Threading.ThreadAbortException
,也正是说线程在ThreadState.AbortRequested状态时表示就要与世长辞可是还一向不真的甘休。但是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立即回到了,而线程真正甘休后的境况应当是ThreadState.Aborted,所以料定要小心在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值可能调用Thread.Join方法来保管被结束线程已经真的截至,唯有当Thread.ThreadState属性为Aborted或Thread.Join方法重临时,才表示线程真正截至了。

实际上三个线程在运转时,大家得以经过Thread.ThreadState属性读出它的状态,正在运作的线程状态正是ThreadState.Running。然后1旦大家想强制结束正在推行的线程,就能够调用Thread.Abort方法,不过Thread.Abort方法做的业务只是在线程上抛出了一个ThreadAbortException极度,然后将线程的动静置为ThreadState.AbortRequested,MSDN对AbortRequested状态的疏解是:已对线程调用了 Thread.Abort
方法,但线程尚未收到试图小憩它的挂起的System.Threading.ThreadAbortException
,约等于说线程在ThreadState.AbortRequested状态时表示将在竣事不过还平素不真正甘休。可是Thread.Abort方法将线程的动静置为ThreadState.AbortRequested后就即刻回到了,而线程真正甘休后的气象应当是ThreadState.Aborted,所以毫无疑问要专注在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值恐怕调用Thread.Join方法来保管被停止线程已经确实结束,只有当Thread.ThreadState属性为Aborted或Thread.Join方法再次来到时,才表示线程真正结束了。

 

 

下边小编就写八个演示代码来评释在调用Thread.Abort方法后,怎么着保障线程甘休后代码才会继续施行

上面作者就写一个示范代码来注明在调用Thread.Abort方法后,怎么样保险线程结束后代码才会继续实践

 

var thread = new Thread(
    new ThreadStart(
        () =>
            {
                while (true)
                {
                    //该线程会进行无限循环,自己不会结束
                    Thread.Sleep(100);
                }
            }));

thread.IsBackground = true;
thread.Start();//启动线程

thread.Abort();//调用Thread.Abort方法试图强制终止thread线程

//上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
while (thread.ThreadState!=ThreadState.Aborted)
{
    //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
    Thread.Sleep(100);
}

//当跳出上面的循环后就表示我们启动的线程thread已经完全终止了
var thread = new Thread(
    new ThreadStart(
        () =>
            {
                while (true)
                {
                    //该线程会进行无限循环,自己不会结束
                    Thread.Sleep(100);
                }
            }));

thread.IsBackground = true;
thread.Start();//启动线程

thread.Abort();//调用Thread.Abort方法试图强制终止thread线程

//上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
while (thread.ThreadState!=ThreadState.Aborted)
{
    //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
    Thread.Sleep(100);
}

//当跳出上面的循环后就表示我们启动的线程thread已经完全终止了

 

 

 

唯独请牢记使用Thread.Abort方法来终止正在推行的线程并不是1个好的章程,因为Abort方法是经过在线程上抛格外来终止线程的,那样或然会生出一些古怪的难点。最棒的艺术是在开行的线程中加时限信号灯,当想要终止线程推行时就更动确定性信号灯的气象,运行的线程当读到能量信号灯状态改动后本人得了代码的实行,那才是最安全的做法。

而是请记住使用Thread.Abort方法来终止正在实行的线程并不是三个好的方式,因为Abort方法是经过在线程上抛分外来终止线程的,那样也许会时有发生一些想不到的难点。最棒的办法是在开发银行的线程中加非功率信号灯,当想要终止线程执行时就改造非确定性信号灯的景色,运营的线程当读到非时域信号灯状态改造后自身得了代码的进行,那才是最安全的做法。

 

 

原稿链接:https://www.cnblogs.com/OpenCoder/p/4587249.html

留下评论

网站地图xml地图