Когда ExecuteCodeWithGuaranteedCleanup на самом деле гарантирует очистку?

Я читал о Функциях Надежности в.NET и записал следующий класс для исследования ExecuteCodeWithGuaranteedCleanup

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

Я экспериментировал со множеством тел кода для Code метод. Они и их результаты во время выполнения упоминаются ниже

Порождение OutOfMemoryException - Cleanup не становится названным

List ss = new List();

while (true)
{
    string s = new string('x', 1000000);

    ss.Add(s);
}

Порождение a StackOverflowException - Cleanup не становится названным

Code(message); // recursive call

Порождение a ExecutionEngineException - Cleanup не становится названным

Environment.FailFast(message.ToString());

Порождение a ThreadAbortException - Cleanup действительно становится названным (однако постоянный клиент try...finally может также поймать это исключение),

Thread.CurrentThread.Abort();

Таким образом, вопросы

  • Я использую ExecuteCodeWithGuaranteedCleanup правильно?
  • Когда ExecuteCodeWithGuaranteedCleanup на самом деле полезный?

9
задан Richard Everett 6 April 2010 в 22:45
поделиться