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 で解決するのに適した他の問題 (ロギング、トランザクション管理、セキュリティなど) を解決できるため、検討することをお勧めします。会社の Web サイトはこちらです。ここで例をご覧いただけます。Pluralsight には、PostSharp の例を含む AOP 方法論に関する優れたコースがあります。幸運を!

于 2012-12-14T15:53:38.980 に答える
1

通常の .Net アプローチは、いくつかの for of同期を使用して、他のスレッドに例外をスローさせるのではなく、他のスレッドをブロックすることです。

于 2012-12-14T15:37:12.573 に答える