我一直在閱讀有關Reliability Features in .NET並寫了下面的類來探索ExecuteCodeWithGuaranteedCleanup
什麼時候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
曹景偉a ExecutionEngineException
- Cleanup
不被調用
Environment.FailFast(message.ToString());
造成ThreadAbortException
- Cleanup
確實被調用(但經常try...finally
還可以趕上這個異常)
Thread.CurrentThread.Abort();
所以問題是
- 我正確使用
ExecuteCodeWithGuaranteedCleanup
嗎? - 什麼時候是
ExecuteCodeWithGuaranteedCleanup
實際上有用?
在實現ICLRPolicyManager的CLR主機上運行此代碼。 SQL Server。 – 2010-04-07 12:45:40