7

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

对于单一方法,此代码有效:

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

4

2 回答 2

3

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

于 2012-12-14T15:53:38.980 回答
1

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

于 2012-12-14T15:37:12.573 回答