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?
Perché ti importa della rientranza? –
Scrivi codice in cui è previsto il rientro, quindi puoi reinserirlo. – Jodrell
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. –