He estado leyendo sobre Reliability Features in .NET y he escrito la siguiente clase para explorar ExecuteCodeWithGuaranteedCleanup
¿Cuándo garantiza realmente ExecuteCodeWithGuaranteedCleanup la limpieza?
class Failing
{
public void Fail()
{
RuntimeHelpers.PrepareConstrainedRegions();
try
{
}
finally
{
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(Code, Cleanup, "fail");
}
}
private void Code(object message)
{
// Some code in here that will cause an exception...
}
private void Cleanup(object message, bool something)
{
Console.WriteLine(message);
Console.ReadLine();
}
}
he experimentado con una variedad de cuerpos de código para el método Code
. Estos, y sus resultados en tiempo de ejecución se enumeran a continuación
causando una OutOfMemoryException
- Cleanup
no significa ser llamado
List<string> ss = new List<string>();
while (true)
{
string s = new string('x', 1000000);
ss.Add(s);
}
Causando una StackOverflowException
- Cleanup
no significa ser llamado
Code(message); // recursive call
Causando a ExecutionEngineException
- Cleanup
no ser llamado
Environment.FailFast(message.ToString());
Causando una ThreadAbortException
-Cleanup
hace ser llamado (sin embargo un habitual try...finally
También se puede coger esta excepción)
Thread.CurrentThread.Abort();
Así que las preguntas son
- ¿Estoy usando
ExecuteCodeWithGuaranteedCleanup
correctamente? - ¿Cuándo es realmente útil
ExecuteCodeWithGuaranteedCleanup
?
Ejecute este código en un host CLR que implemente ICLRPolicyManager. Servidor SQL. –