C# - 线程中止异常(线程中止异常)重新抛出自身

No *_*ame 10 c# multithreading exception

我有当前的代码:

class Program
{
    private static void Main()
    {
        while (true)
        {

            try
            {
                Thread.CurrentThread.Abort();
            }
            catch (ThreadAbortException)
            {
                Console.WriteLine("Abort!");
                Thread.ResetAbort();
            }


            Console.WriteLine("now waiting");
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我知道该方法ResetAbort应该阻止ThreadAbortException继续重新抛出自己,即使catch语句正在捕获它,但我的问题是:

如果任何人都可以使用该ResetAbort方法,那么异常的重点是什么?

用户可以做到

    catch (ThreadAbortException ex)
    {
        Console.WriteLine("Abort!");
        throw ex;
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*ell 7

Thread.ResetAbort()不适合常用.如果您不理解为什么中止发生,它可能会导致不良行为.因此,可能要使ASP.NET在共享托管环境中保持稳定,SecurityPermissionFlag.ControlThread需要具有调用权限Thread.ResetAbort()

MSDN链接


Luc*_*ski 6

ThreadAbortException重新抛出本身是确保线程终止,除非用户明确要求ResetAbort.

让我解释:

try
{
    // ... Thread abort happens somewhere in here
}
catch (Exception ex)
{
    _log.Error(ex);
}
Run Code Online (Sandbox Code Playgroud)

这里有一个典型的代码示例,可确保没有异常从try块内部传播.我知道捕捉Exception是不好的做法,但是这样的代码仍然存在.

如果你Abort在线程在try块内时调用,你仍然希望它中止.您无法依赖用户在任何地方编写此类代码:

try
{
    // ... Thread abort happens somewhere in here
}
catch (ThreadAbortException)
{
    throw; // No, you'll NEVER see code like this in real life
}
catch (Exception ex)
{
    _log.Error(ex);
}
Run Code Online (Sandbox Code Playgroud)

因此,为了提供某种可靠Abort的异常必须被自动被再次抛出,也可以很容易地得到意外丢弃.

ResetAbort 这是非常罕见的情况,当您专门检测线程中止,并且您确切地知道它为什么会发生,并且您想要阻止它.

不用说,用例非常罕见.线程中止由运行时以非常特殊的方式处理,您应该尽可能地避免它们.哎呀,他们甚至不像你指出的那样可靠,所有这些讨论都忽视了CER,这使事情变得更糟.