gpt4 book ai didi

.net - 如何在 finally block 中检测 ThreadAbortException? (。网)

转载 作者:行者123 更新时间:2023-12-04 05:28:12 26 4
gpt4 key购买 nike

我在 finally 块(带有一个空的 try 块)中有一些关键逻辑,因为我想保证即使线程中止也能执行代码。但是,我还想检测 ThreadAbortException。我发现将我的关键 try/finally 块包装在 try/catch 中不会捕获 ThreadAbortException。有什么办法可以检测到吗?

尝试 {
尝试 { }
最后 {
//关键逻辑
}
} catch(异常前){
//这里没有捕获ThreadAbortException,而是抛出异常
//从关键逻辑是
}

最佳答案

这是一个奇怪的问题。

您发布的代码应该可以工作。似乎正在进行某种优化,决定不调用您的捕获处理程序。

所以,我想用这个检测异常:

bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = false;
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");

(我的实际代码只是停留在那个关键代码部分,所以我可以确定它最终会中止。)

它打印:

Thread aborted? False



嗯,确实奇怪!

所以我想在那里做更多的工作,以欺骗任何“智能”优化:
bool threadAborted = true;
try {
try { }
finally { /* critical code */ }
threadAborted = AmIEvil();
}
finally {
Console.WriteLine("Thread aborted? {0}", threadAborted);
}
Console.WriteLine("Done");

哪里 AmIEvil只是:
[MethodImpl(MethodImplOptions.NoInlining)]
static bool AmIEvil() {
return false;
}

最后打印出来:

Thread aborted? True



你有它。在您的代码中使用它:
try {
try { }
finally { /* critical code */ }
NoOp();
}
catch (Exception ex) {
// ThreadAbortException is caught here now!
}

哪里 NoOp只是:
[MethodImpl(MethodImplOptions.NoInlining)]
static void NoOp() { }

关于.net - 如何在 finally block 中检测 ThreadAbortException? (。网),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/353270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com