可以在Final块的中间引发ThreadAbortException吗?

假定以下代码在单独的线程中运行:

try{
  var stuffToDispose = new SomeclassThatNeedsDisposing();
  //doing thing with stuffToDispose
}
finally{
   if(stuffToDispose != null)
     stuffToDispose.Dispose();
}

,并且该线程使用引发threadabortexception的机制中止。 threadabortexception是否可以在null检查和Dispose()之间发生?又是,在最后的街区中间?

finally{
   if(stuffToDispose != null)
     //This is where the Exception would strike
     stuffToDispose.Dispose();
}

我很确定答案是否定的,但是其他人似乎相信这是可能的。

luckycq211 回答:可以在Final块的中间引发ThreadAbortException吗?

.NET Framework 中,ThreadAbortExceptioncatchfinally块中以特殊方式处理:

  • 如果捕获到ThreadAbortException,它将在catch块的末尾自动重新引发(除非被Thread.ResetAbort抑制)
  • finally块中,ThreadAbortException直到整个块结束都不会被“激活”。这是预期的行为。这就是为什么您有时会在try {}部分中所有空白的finally块中找到obscure codes的原因。它保证了本节不会被中止。

另一方面, .NET Core 不支持Thread.Abort(引发PlatformNotSupportedException)。 ThreadAbortException本身尚未删除(出于兼容性方面的考虑),因此您仍然可以明确地抛出它,但我认为仍然不能如上所述进行处理(我没有对其进行测试)。

,

最后不会被以下情况打断

.NET 4.0.0-4.7.2 下运行此代码将无限期地在Thread.Abort()打印foo并最终挂起时锁定:

class Program
{
    static void Main(string[] args)
    {
        var i = false;
        var t = new Thread(() =>
        {
            try { Console.Write("foo"); } finally { while (true) { i=true; } }
        });
        t.Start();
        Thread.Sleep(200);
        t.Abort();
        t.Join();
        Console.WriteLine("bar = {0}",i);
        Console.ReadKey();
    }
}

尽管如此,我们不能保证有时在其他版本中不会执行该操作。

最后将被执行,但如果被

则中断

.NET 2.0-3.5 下运行同一部分将显示foobar = True,这表明它已被中断。

但是,如果您这样修改它:

        var t = new Thread(() =>
        {
            try { Console.Write("foo"); } finally { while (true) { Console.Write(".");} }
        });

它将像第一个示例一样无限运行。这很奇怪。

摘要

最好直接向Microsoft询问。

,

根据我的测试,调用Thread.Abort不会中断线程中当前正在运行的finally块。

测试代码:

var thread = new Thread(() =>
{
    try
    {
    }
    catch (ThreadAbortException)
    {
        Console.WriteLine("ThreadAbortException");
        throw;
    }
    finally
    {
        Console.WriteLine("Thread Finally Started");
        Thread.Sleep(200);
        Console.WriteLine("Thread Finally Finished");
    }
})
{ IsBackground = true };
thread.Start();
Thread.Sleep(100);
Console.WriteLine("Aborting...");
thread.Abort();
thread.Join();

输出(.NET Framework 4.8):

  

线程终于开始了
  正在中止...
  线程最终完成

请记住,.NET Core不支持Thread.Abort

  

System.PlatformNotSupportedException:该平台不支持线程中止。

本文链接:https://www.f2er.com/3133147.html

大家都在问