我正在处理一个庞大而复杂的事件驱动代码体,并且有很多机会不小心创建递归条件。
有时递归条件是暂时的,应用程序会自行 catch ,但即使这样通常也会造成不必要的延迟。其他时候它会创建一个计算器溢出,当它发生在客户端站点时通常很难调试。
我希望有一种方法可以将允许递归的代码部分列入黑名单或白名单。如果递归条件在 DEV 期间发生,那么我希望它断言以便我可以更正代码。
我正在考虑的是让应用程序检查自己的堆栈,以确保它刚刚输入的方法不在堆栈中。
如有任何指点,我们将不胜感激。
注意:这是针对 Web 应用程序的,但我在多个环境中遇到过这个挑战。
你可以像这样检查堆栈:
[MethodImpl(MethodImplOptions.NoInlining)]
// optionally decorate with Conditional to only be used in Debug configuration
[Conditional("DEBUG")]
public static void FailIfCallerIsRecursive() {
var trace = new StackTrace();
// previous frame is the caller
var caller = trace.GetFrame(1).GetMethod();
// inspect the rest
for (int i = 2; i < trace.FrameCount; i++) {
// if found caller somewhere up the stack - throw
if (trace.GetFrame(i).GetMethod() == caller)
throw new Exception("Recursion detected");
}
}
然后把它称为开始:
void MyPotentiallyRecursiveMethod() {
FailIfCallerIsRecursive()
}
但请注意,它非常昂贵。但是,由于您将仅在开发(调试)配置中使用它 - 为什么不呢。您还可以对其进行一些修改,使其仅在检测到特定级别的递归时抛出(因此调用者在堆栈中出现 X 次)。
我是一名优秀的程序员,十分优秀!