我一直在阅读.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<string> ss = new List<string>();
while (true)
{
string s = new string('x', 1000000);
ss.Add(s);
}
导致StackOverflowException
-Cleanup
不会被调用
Code(message); // recursive call
导致ExecutionEngineException
-Cleanup
不会被调用
Environment.FailFast(message.ToString());
导致ThreadAbortException
-Cleanup
确实被调用(但是常规try...finally
也可以捕获此异常)
Thread.CurrentThread.Abort();
所以问题是
- 我使用
ExecuteCodeWithGuaranteedCleanup
正确吗? - 什么时候
ExecuteCodeWithGuaranteedCleanup
真正有用?