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)
点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,这使事情变得更糟.
| 归档时间: |
|
| 查看次数: |
2615 次 |
| 最近记录: |