Tôi đã được đọc về Reliability Features in .NET và đã viết các lớp sau đây để khám phá ExecuteCodeWithGuaranteedCleanup
Khi nào ExecuteCodeWithGuaranteedCleanup thực sự đảm bảo dọn dẹp?
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();
}
}
tôi đã thử nghiệm với một loạt các cơ quan mã cho phương pháp Code
. Những điều này, và kết quả thực thi của họ được liệt kê dưới đây
Gây một OutOfMemoryException
-Cleanup
không được gọi
List<string> ss = new List<string>();
while (true)
{
string s = new string('x', 1000000);
ss.Add(s);
}
Gây một StackOverflowException
- Cleanup
không được gọi
Code(message); // recursive call
Gây a ExecutionEngineException
- Cleanup
không được gọi
Environment.FailFast(message.ToString());
Gây một ThreadAbortException
-Cleanup
không được gọi (tuy nhiên thường xuyên try...finally
cũng có thể bắt ngoại lệ này)
Thread.CurrentThread.Abort();
Vì vậy, câu hỏi là
- Tôi có đang sử dụng
ExecuteCodeWithGuaranteedCleanup
chính xác không? - Khi nào là
ExecuteCodeWithGuaranteedCleanup
thực sự hữu ích?
Chạy mã này trên máy chủ CLR triển khai ICLRPolicyManager. SQL Server. –