2012-12-14 9 views
6

Ich möchte Reentrancy für große Menge von Methoden verbieten.Hat das Framework dedizierte API, um Reentrancy zu erkennen?

für die einzelne Methode funktioniert diesen Code:

bool _isInMyMethod; 
void MyMethod() 
{ 
    if (_isInMethod) 
     throw new ReentrancyException(); 

    _isInMethod = true; 
    try 
    { 
     ...do something... 
    } 
    finally 
    { 
     _isInMethod = false; 
    } 
} 

Dies ist mühsam es für jede Methode zu tun.
Also habe ich verwendet Stacktrace-Klasse:

 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(); 
     } 

Es funktioniert gut, aber sieht eher wie ein Hack.

Hat .NET Framework spezielle API zur Erkennung von Reentrancy?

+2

Warum interessieren Sie sich für Reentrancy? –

+0

Code schreiben, bei dem der Wiedereintritt erwartet wird, dann können Sie ihn erneut eingeben. – Jodrell

+0

Legacy-Code. Wir haben Tonnen von Abhängigkeiten zwischen Fenstern. Eine einzelne Aktion kann viele unnötige Wiederholungskaskaden von Ereignissen, Aktualisierungen und Datenbankanforderungen verursachen. Und es ist schwer, jede solche Schleife mit den Augen zu erkennen. –

Antwort

3

Ich empfehle die Verwendung von PostSharp, um Ihr Problem zu lösen. Obwohl es möglicherweise teuer ist, ein kommerzielles Tool nur aus einem bestimmten Grund zu verwenden, schlage ich vor, dass Sie es sich ansehen, da dieses Tool andere Probleme lösen kann, die besser durch AOP gelöst werden können (Protokollierung, Transaktionsverwaltung, Sicherheit und mehr). Die Firmenwebsite ist here und Sie können Beispiele here betrachten. Pluralsight hat einen guten Kurs zur AOP-Methodik mit Beispielen in PostSharp here. Viel Glück!

+0

Ja, wir haben viele Dinge zu tun. Ich interessiere mich für PostSharp und habe es in meinem Lernplan. Aber wir werden wahrscheinlich mit AOP in Form von dynamischem Abfangen beginnen ... später, nach dem Annehmen eines geeigneten DI-Containers. =) –

+0

@voroninp - meinen Sie, dass Sie Werkzeuge wie dynamische Proxies und dergleichen verwenden wollen? – Ikaso

+0

@lkaso ja. Irgendetwas stimmt nicht mit diesem Ansatz? –

1

Der normale. NET-Ansatz besteht darin, einige für synchronization zu verwenden, um andere Threads zu blockieren, anstatt sie eine Ausnahme auszulösen.

+0

Das wird nicht helfen. Es geht nicht um asynchrone Operationen. Wir haben nur endliche Zyklen von Ereignissen: Ein Feuer, dann fängt B, tut etwas, löst ein Ereignis aus, das von C gehandhabt wird und C tut etwas mit A, was bewirkt, dass A das Ereignis erneut auslöst. –