我想禁止大量方法的重入。
单个方法的使用此代码:
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来检测重入?
答案 0 :(得分:3)
我建议使用PostSharp来解决您的问题。虽然仅出于特定原因使用商业工具可能会很昂贵,但我建议您先看一下,因为此工具可以解决其他更适合AOP解决的问题(日志记录,事务管理,安全性等)。公司网站为here,您可以查看示例here。 Pluralsight在AOP方法学方面有很好的课程,并在PostSharp here中有例子。祝你好运!
答案 1 :(得分:1)
正常的.Net方法是使用synchronization的一些来阻止其他线程,而不是让它们抛出异常。