框架是否有专门的api来检测重入?

时间:2012-12-14 15:18:46

标签: c# .net reentrancy

我想禁止大量方法的重入。

单个方法的

使用此代码:

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来检测重入?

2 个答案:

答案 0 :(得分:3)

我建议使用PostSharp来解决您的问题。虽然仅出于特定原因使用商业工具可能会很昂贵,但我建议您先看一下,因为此工具可以解决其他更适合AOP解决的问题(日志记录,事务管理,安全性等)。公司网站为here,您可以查看示例here。 Pluralsight在AOP方法学方面有很好的课程,并在PostSharp here中有例子。祝你好运!

答案 1 :(得分:1)

正常的.Net方法是使用synchronization的一些来阻止其他线程,而不是让它们抛出异常。