Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net ThreadAbortException内部实现_.net_Multithreading_Exception Handling_Cil - Fatal编程技术网

.net ThreadAbortException内部实现

.net ThreadAbortException内部实现,.net,multithreading,exception-handling,cil,.net,Multithreading,Exception Handling,Cil,我们都知道,.NET Framework提供了一点特定的ThreadAbortException处理实现。表示无法通过try catch finally块捕获此异常。再深入一点看,我们知道这个异常实际上是catch,但在catch块的末尾重新抛出。(实际上,我们可以使用Thread.ResetAbort()方法来防止堆栈展开) 但让我们看看MSIL: .try { IL_0001: nop IL_0002: call void WCFTem

我们都知道,.NET Framework提供了一点特定的
ThreadAbortException
处理实现。表示无法通过
try catch finally
块捕获此异常。再深入一点看,我们知道这个异常实际上是catch,但在catch块的末尾重新抛出。(实际上,我们可以使用
Thread.ResetAbort()
方法来防止堆栈展开)

但让我们看看MSIL:

    .try
    {
      IL_0001:  nop
      IL_0002:  call       void WCFTemp.Program::Method()
      IL_0007:  nop
      IL_0008:  nop
      IL_0009:  leave.s    IL_0010
    }  // end .try
    catch [mscorlib]System.Exception 
    {
      IL_000b:  stloc.0
      IL_000c:  nop
      IL_000d:  nop
      IL_000e:  leave.s    IL_0010
    }  // end handler
    IL_0010:  nop
    IL_0011:  leave.s    IL_0016
  }  // end .try
  finally
  {
    IL_0013:  nop
    IL_0014:  nop
    IL_0015:  endfinally
  }  // end handler
正如我们所看到的,没有任何指令使运行时重新抛出这种类型的异常


所以我的问题是它是如何实现的?

它与IL没有任何关系。异常由CLR实现,它们依赖于Windows for SEH(结构化异常处理)中的本机支持。抛出异常时运行的第一个代码是CLR中的代码。这样它就可以随心所欲了。查找catch块并运行其代码只是其任务之一。代码运行后发生的事情由CLR决定


通过阅读SSCLI20源代码,您可以更深入地了解这一点。但是请注意,clr/src/vm/excep.cpp绝对是最难处理的代码块之一。

它与IL没有任何关系。异常由CLR实现,它们依赖于Windows for SEH(结构化异常处理)中的本机支持。抛出异常时运行的第一个代码是CLR中的代码。这样它就可以随心所欲了。查找catch块并运行其代码只是其任务之一。代码运行后发生的事情由CLR决定


通过阅读SSCLI20源代码,您可以更深入地了解这一点。但是请注意,clr/src/vm/excep.cpp绝对是最难处理的代码块之一。

因此,让我们跳过前面提到的情况。运行时传递try-block的内部和异常时的绊脚石。CLR在自身内部运行一些代码,异常得到了处理。ThreadAbortException在catch块中可用,当运行时到达某个IL指令时,它将被重新抛出,比如leave.s。对吗?因为它看起来是实现它的唯一可能的方法,没有奇怪的变通方法。不知道你在问什么。throw关键字也在CLR中实现。直观上很简单,Thread.Abort()在内部线程状态中设置一个状态标志,指示它正忙于中止。此状态标志由CLR中的异常处理代码检查。因此,让我们跳过上述情况。运行时传递try-block的内部和异常时的绊脚石。CLR在自身内部运行一些代码,异常得到了处理。ThreadAbortException在catch块中可用,当运行时到达某个IL指令时,它将被重新抛出,比如leave.s。对吗?因为它看起来是实现它的唯一可能的方法,没有奇怪的变通方法。不知道你在问什么。throw关键字也在CLR中实现。直观上很简单,Thread.Abort()在内部线程状态中设置一个状态标志,指示它正忙于中止。此状态标志由CLR中的异常处理代码检查。