zoukankan      html  css  js  c++  java
  • 关于ThreadAbortExcption异常处理

    之前程序中,使用Thread.Abort()方法来终止线程的运行,但它是抛出ThreadAbortException异常来终止线程。

    异常信息摘要:

    Unhandled Exception:Thread was being aborted.

    但此时,不想抛出此异常而使用线程终止,就使用了catch方式来捕获此异常,但即使捕获异常之后,程序还是会报ThreadAbortException异常。

    最后终于在 http://msdn.microsoft.com/zh-cn/library/system.threading.threadabortexception.aspx 中找到了合理的解释。

    备注:

    在调用 Abort 方法以销毁线程时,公共语言运行时将引发 ThreadAbortException。 ThreadAbortException 是一种可捕获的特殊异常,但在 catch 块的结尾处它将自动被再次引发。 引发此异常时,运行时将在结束线程前执行所有 finally 块。 由于线程可以在 finally 块中执行未绑定计算或调用 Thread.ResetAbort 来取消中止,所以不能保证线程将完全结束。 如果您希望一直等到被中止的线程结束,可以调用 Thread.Join 方法。 Join 是一个阻塞调用,它直到线程实际停止执行时才返回。


    处理方式是在catch到ThreadAbortException异常后,使用Thread.ResetAbort()来取消中止。

    下面是MSDN上的代码示例:

     1 using System;
     2 using System.Threading;
     3 using System.Security.Permissions;
     4 
     5 public class ThreadWork {
     6     public static void DoWork() {
     7         try {
     8             for(int i=0; i<100; i++) {
     9                 Console.WriteLine("Thread - working."); 
    10                 Thread.Sleep(100);
    11             }
    12         }
    13         catch(ThreadAbortException e) {
    14             Console.WriteLine("Thread - caught ThreadAbortException - resetting.");
    15             Console.WriteLine("Exception message: {0}", e.Message);
    16             Thread.ResetAbort();
    17         }
    18         Console.WriteLine("Thread - still alive and working."); 
    19         Thread.Sleep(1000);
    20         Console.WriteLine("Thread - finished working.");
    21     }
    22 }
    23 
    24 class ThreadAbortTest {
    25     public static void Main() {
    26         ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork);
    27         Thread myThread = new Thread(myThreadDelegate);
    28         myThread.Start();
    29         Thread.Sleep(100);
    30         Console.WriteLine("Main - aborting my thread.");
    31         myThread.Abort();
    32         myThread.Join();
    33         Console.WriteLine("Main ending."); 
    34     }
    35 }
    View Code

    执行结果:

     Thread - working.
     Main - aborting my thread.
     Thread - caught ThreadAbortException - resetting.
     Exception message: Thread was being aborted.
     Thread - still alive and working.
     Thread - finished working.
     Main ending.
  • 相关阅读:
    BZOJ4240: 有趣的家庭菜园
    BZOJ1509: [NOI2003]逃学的小孩
    BZOJ5301: [Cqoi2018]异或序列
    BZOJ4540: [Hnoi2016]序列
    BZOJ4956: [Wf2017]Secret Chamber at Mount Rushmore
    BZOJ2141: 排队
    BZOJ1833: [ZJOI2010]count 数字计数
    HDU2089: 不要62
    BZOJ5178: [Jsoi2011]棒棒糖
    BZOJ3439: Kpm的MC密码
  • 原文地址:https://www.cnblogs.com/xpyan/p/3926940.html
Copyright © 2011-2022 走看看