Ho letto su Reliability Features in .NET e ho scritto la seguente classe di esplorare ExecuteCodeWithGuaranteedCleanup
Quando ExecuteCodeWithGuaranteedCleanup garantisce effettivamente la pulizia?
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();
}
}
ho sperimentato con una varietà di corpi codice per il metodo Code
. Questi, ed i loro risultati di runtime sono elencati di seguito
causando un OutOfMemoryException
-Cleanup
non significa ottenere chiamato
List<string> ss = new List<string>();
while (true)
{
string s = new string('x', 1000000);
ss.Add(s);
}
Causando un StackOverflowException
- Cleanup
non significa ottenere chiamato
Code(message); // recursive call
Causando a ExecutionEngineException
- Cleanup
non ottenere chiamato
Environment.FailFast(message.ToString());
Causando un ThreadAbortException
-Cleanup
fa ottenere chiamato (comunque un regolare try...finally
può anche prendere questa eccezione)
Thread.CurrentThread.Abort();
Quindi le domande sono
- Sto usando
ExecuteCodeWithGuaranteedCleanup
correttamente? - Quando è effettivamente utile il
ExecuteCodeWithGuaranteedCleanup
?
Eseguire questo codice su un host CLR che implementa ICLRPolicyManager. Server SQL. –