Trước hết, chúng ta hãy đọc về CriticalFinalizerObject trong MSDN, chúng ta có thể đọc, rằng:
Trong các lớp học có nguồn gốc từ các nhà phê bình Lớp alFinalizerObject, thời gian chạy ngôn ngữ chung (CLR) đảm bảo rằng tất cả các mã quyết toán quan trọng sẽ có cơ hội thực thi, miễn là các finalizer tuân theo các quy tắc cho CER, ngay cả trong trường hợp CLR buộc unloads miền ứng dụng hoặc hủy bỏ chủ đề.
Từ chính ở đây là UNLOAD.
Thứ hai, chúng ta hãy đọc MSDN một lần nữa, lần này là về ngoại lệ trong chủ đề quản lý:
Nếu những trường hợp ngoại lệ là unhandled trong thread chính, hoặc trong chủ đề đó vào thời gian chạy từ mã không được quản lý, họ tiến hành bình thường, dẫn đến việc chấm dứt chấm dứt của đơn đăng ký.
Từ chính là CHẤM DỨT.
Vì vậy, khi có một ngoại lệ chưa được giải quyết trong chủ đề chính - ứng dụng chấm dứt, nhưng CriticalFinalizerObject chỉ giúp khi dỡ miền.
Ví dụ, CriticalFinalizerObject lon giúp trong tình huống như vậy:
// Create an Application Domain:
AppDomain newDomain = AppDomain.CreateDomain("NewApplicationDomain");
// Load and execute an assembly:
newDomain.ExecuteAssembly(@"YouNetApp.exe");
//Unload of loaded domain
AppDomain.Unload(newDomain);
Đây là một tình huống, nơi miền đã được bốc dỡ, và CriticalFinalizerObject đảm bảo với bạn, rằng finalizer của bạn sẽ được gọi.
Trong tình huống của bạn với chấm dứt các ứng dụng bạn có thể thử để đăng ký
AppDomain.CurrentDomain.UnhandledException
và tự hoàn thiện đối tượng của bạn.
UPD: Jeffrey Richter trong cuốn sách của ông "CLR thông qua C#" viết về CriticalFinalizerObject, rằng đó là vì tình huống mà bạn gửi mã của bạn ví dụ như SQLServer, có thể chạy C# như một thủ tục. Trong trường hợp này CriticalFinalizerObject giúp bạn làm sạch đối tượng của bạn, nếu SQLServer sẽ dỡ bỏ tên miền của thư viện của bạn. CriticalFinalizerObject cũng cho các tình huống mà bạn cần trong finalizer của đối tượng để gọi method của đối tượng khác, vì CriticalFinalizerObject đảm bảo với bạn, rằng finalizer sẽ được gọi sau finalizers của tất cả các đối tượng CriticalFinalizerObject không.
Cảm ơn câu trả lời chi tiết! Tôi sẽ nói những từ như "chấm dứt" và "không tải" không được xác định rất rõ trong các tài liệu MS này. Theo nghĩa thông thường, có một cái gì đó "chấm dứt" không nhất thiết có nghĩa là nó sẽ không được "dỡ", mặc dù chúng ta thấy nó không giống như ở đây ... – IlyaP
Tôi đã thêm một số cập nhật để trả lời từ "CLR via C#" – igofed