Đây là phần tiếp theo của tôi initial question và tôi muốn trình bày những phát hiện của mình và yêu cầu chỉnh sửa, ý tưởng và thông tin chi tiết. Phát hiện của tôi (hoặc đúng hơn là giải thích) xuất phát từ câu trả lời của mọi người cho câu hỏi trước của tôi, đọc tài liệu MSDN .NET 3.5 và gỡ lỗi mã .NET 3.5. Tôi hy vọng điều này sẽ có giá trị đối với một người tự hỏi tôi như thế nào để phát hiện khi một ứng dụng chấm dứt.Làm thế nào để phát hiện khi ứng dụng chấm dứt?
Sự kiện:
System.AppDomain.CurrentDomain.ProcessExit
: tăng khi quá trình thoát, ví dụ sau khi mặc địnhAppDomain
và mọi thứ khác đã được tải xuống [Tổng thời gian thực hiện được giới hạn chỉ trong 3 giây!]. Đối với WPF, thay vào đó hãy sử dụngSystem.Windows.Application.Exit
. Đối với Windows Forms, hãy chạy mã sauApplication.Run(...)
trong phương thức chính.System.AppDomain.CurrentDomain.DomainUnload
: được tăng lên khi sốAppDomain
khác với mặc địnhAppDomain
unloads, ví dụ: khi chạy các lớp với các khung kiểm thử đơn vị (MbUnit với TestDriven.NET).System.AppDomain.CurrentDomain.UnhandledException
: (nếu xử lý theo mặc địnhAppDomain
:) huy động đối với bất kỳ ngoại lệ nào trong bất kỳ chủ đề, không có vấn đề gìAppDomain
thread bắt đầu trong Điều này có nghĩa, điều này có thể được sử dụng như là nhận tất cả cho tất cả các trường hợp ngoại lệ unhandled..System.Windows.Application.Exit
: được tăng lên khi ứng dụng WPF (ví dụ: mặc địnhAppDomain
) thoát ra một cách duyên dáng. Ghi đèSystem.Windows.Application.OnExit
để tận dụng lợi thế của nó.finalizers (destructors in C#): chạy khi bộ gom rác giải phóng tài nguyên không được quản lý. [Tổng thời gian thực hiện được giới hạn!].
Trình tự các sự kiện:
WPF ứng dụng: thoát duyên dáng
System.Windows.Application.Exit
System.AppDomain.CurrentDomain.ProcessExit
- bộ hoàn thiện
WPF ứng dụng: unhandled ngoại lệ
System.AppDomain.CurrentDomain.UnhandledException
MbUnit chạy bên TestDriven.NET: test qua (duyên dáng thoát)
System.AppDomain.CurrentDomain.DomainUnload
- bộ hoàn thiện
MbUnit chạy bên trong TestDriven.NET: thất bại trong thử nghiệm (trường hợp ngoại lệ unhandled được xử lý bởi MbUnit)
AppDomain.CurrentDomain.DomainUnload
- bộ hoàn thiện
Câu hỏi:
- Are giải thích của tôi/phát hiện có đúng không?
- Bạn có biết thêm chi tiết mà tôi có bị bỏ quên không? Ví dụ. tổng số thời gian thực hiện cho finalizers là bao nhiêu?
- Bạn có biết bất kỳ sự kiện nào khác/ ý tưởng mà tôi biết không?
- Có sự kiện gì và họ nhận được thứ tự nào trong các ứng dụng khác, ví dụ: Windows Forms, dịch vụ Web, trang web ASP.NET, v.v ...?
Chỉ cần một lưu ý/FYI: đây là chỉ có sẵn trong .NET 3.0+, bạn sẽ cần phải liên kết chống lại System.Core.dll sử dụng nó trong .NET 2.0 –