我想禁止大量方法的重入。
对于单一方法,此代码有效:
bool _isInMyMethod;
void MyMethod()
{
if (_isInMethod)
throw new ReentrancyException();
_isInMethod = true;
try
{
...do something...
}
finally
{
_isInMethod = false;
}
}
对每种方法都这样做很乏味。
所以我使用了 StackTrace 类:
public static void ThrowIfReentrant()
{
var stackTrace = new StackTrace(false);
var frames = stackTrace.GetFrames();
var callingMethod = frames[1].GetMethod();
if (frames.Skip(2).Any( frame => EqualityComparer<MethodBase>.Default.Equals(callingMethod,frame.GetMethod())))
throw new ReentrancyException();
}
它工作正常,但看起来更像是一个黑客。
.NET Framework 是否有特殊的 API 来检测重入?