メソッドの大規模なセットの再入を禁止したい。
単一のメソッドの場合、次のコードが機能します。
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 がありますか?