2012-12-14 7 views
6

Desidero vietare la rientranza per un ampio insieme di metodi.Il framework ha un'API dedicata per rilevare la rientranza?

per il singolo metodo funziona questo codice:

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

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

Questo è noioso di farlo per ogni metodo.
Così ho usato classe 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(); 
     } 

Funziona bene, ma sembra più un hack.

.NET Framework dispone di un'API speciale per rilevare la rientranza?

+2

Perché ti importa della rientranza? –

+0

Scrivi codice in cui è previsto il rientro, quindi puoi reinserirlo. – Jodrell

+0

Codice precedente. Abbiamo tonnellate di interdipendenze tra le finestre. L'azione singola può causare numerosi inutili ripetitori a cascata di eventi, aggiornamenti, richieste di database. Ed è difficile rilevare ogni loop con gli occhi. –

risposta

3

Si consiglia di utilizzare PostSharp per risolvere il problema. Anche se potrebbe essere costoso utilizzare lo strumento commerciale solo per una ragione specifica, ti suggerisco di dare un'occhiata dato che questo strumento può risolvere altri problemi più adatti per essere risolti da AOP (logging, gestione delle transazioni, sicurezza e altro). Il sito Web dell'azienda è here e puoi dare un'occhiata agli esempi here. Pluralsight ha un buon corso sulla metodologia AOP con esempi in PostSharp here. In bocca al lupo!

+0

Sì, abbiamo molte cose da fare. Sono interessato a PostSharp e ce l'ho nel mio piano di apprendimento. Ma probabilmente inizieremo con AOP sotto forma di intercettazione dinamica ... in seguito, dopo aver adottato il contenitore DI appropriato. =) –

+0

@voroninp - intendi che intendi utilizzare strumenti come proxy dinamici e simili? – Ikaso

+0

@lkaso si. Qualcosa non va con questo approccio? –

1

L'approccio .Net normale è quello di utilizzare alcuni per synchronization per bloccare altri thread, piuttosto che farli lanciare un'eccezione.

+0

Questo non aiuta. Non è questione di operazioni asincrone. Abbiamo solo cicli di eventi finiti: un incendio poi B cattura, fa qualcosa, solleva l'evento gestito da C e C fa qualcosa con A che cosa causa A ad aumentare di nuovo l'evento. –