Có ba loại gọi là "ngoại lệ không đồng bộ". Đó là ThreadAbortException, OutOfMemoryException và StackOverflowException đã đề cập. Những ngoại lệ được phép xảy ra ở bất kỳ hướng dẫn nào trong mã của bạn.
Và, cũng có cách khắc phục chúng:
Dễ nhất là ThreadAbortException. Khi mã hiện tại thực hiện trong một khối cuối cùng. ThreadAbortExceptions là loại "di chuyển" đến cuối của khối cuối cùng. Vì vậy, tất cả mọi thứ trong một khối cuối cùng không thể bị hủy bỏ bởi một ThreadAbortException.
Để tránh ngoại lệ OutOfMemoryException, bạn chỉ có một khả năng: Không phân bổ bất kỳ thứ gì trên Heap. Điều này có nghĩa là bạn không được phép tạo bất kỳ loại tham chiếu mới nào.
Để khắc phục StackOverflowException, bạn cần một số trợ giúp từ Framework. Sự trợ giúp này thể hiện trong các Vùng Thực thi Hạn chế. Ngăn xếp cần thiết được phân bổ trước khi mã thực tế được thực hiện và bổ sung cũng đảm bảo rằng mã đã được JIT biên dịch và có sẵn để thực thi.
Có ba hình thức để thực thi mã trong vùng Execution Constrained (sao chép từ BCL Team Blog):
- ExecuteCodeWithGuaranteedCleanup, một hình thức ngăn xếp tràn an toàn của một thử/cuối cùng.
- Một khối thử/cuối cùng được đặt trước ngay lập tức bằng một cuộc gọi tới RuntimeHelpers.PrepareConstrainedRegions. Khối thử không bị ràng buộc, nhưng tất cả các khối bắt, cuối cùng và lỗi đều được thử.
- Là trình hoàn thiện quan trọng - bất kỳ lớp con nào của CriticalFinalizerObject đều có trình kết thúc được chuẩn bị háo hức trước khi một thể hiện của đối tượng được cấp phát.
- Trường hợp đặc biệt là phương pháp ReleaseHandle của ReleaseHandle, một phương pháp ảo được chuẩn bị háo hức trước khi phân lớp được phân bổ và được gọi từ trình xác nhận quan trọng của SafeHandle.
Bạn có thể tìm thêm ở những bài đăng trên blog:
Constrained Execution Regions and other errata [Brian Grunkemeyer] tại BCL Team Blog.
Weblog của Joe Duffy về Atomicity and asynchronous exception failures nơi ông đưa ra tổng quan rất tốt về ngoại lệ không đồng bộ và tính chắc chắn trong khung .net.
Nguồn
2008-09-20 12:33:05
Tôi thấy có phần đáng ngạc nhiên, sau khi tất cả clr là mã sở hữu của microsoft, họ có thể đã bỏ qua một vài khung ngăn xếp để cho phép xử lý ngoại lệ. – adams
Làm cách nào để biết số tiền cần đặt trước? Trong tình trạng tràn ngăn xếp, chính chồng đã phát triển đến kích thước như vậy mà nó không dễ dàng. Bằng cách đặt trước một số không gian bạn cần phải đặt trước kích thước ngăn xếp tối đa, điều này sẽ lần lượt phân nửa số lượng sẵn có cho phần mềm. – blowdart
Ok, tôi có ý tưởng này ... Loại ... Trong môi trường đơn luồng. Nhưng hey, chúng ta có thể tạo ra nhiều hơn một sợi, phải không? Và mỗi luồng có một ngăn xếp riêng biệt, phải không? Sau đó, tại sao chấm dứt toàn bộ quá trình khi chỉ có một chủ đề chạy ra khỏi ngăn xếp? –