Cuối cùng chúng tôi tìm thấy thêm về điều này (nhưng lúc đó máy của tôi đã được xây dựng lại và mất cookie vào hồ sơ chưa đăng ký của tôi ở đây; hy vọng nó sẽ cho phép bạn đăng câu trả lời này).
Tiếp tục điều tra cuối cùng tìm thấy một vài sự kiện nữa mà chúng tôi đã tìm thấy hữu ích:
System.Windows.Forms.Application.ThreadExit
- Hỏa hoạn khi một vòng lặp thông điệp thoát System.Windows.Forms.Application.ApplicationExit
- Hỏa hoạn khi tất cả các thông điệp vòng thoát System.AppDomain.CurrentDomain.DomainUnload
- Hỏa hoạn khi một miền khác với mặc định thoát System.AppDomain.CurrentDomain.ProcessExit
- Kích hoạt khi miền ứng dụng mặc định thoát System.AppDomain.CurrentDomain.UnhandledException
- Kích hoạt khi xảy ra trường hợp ngoại lệ chưa được thực hiện, kết thúc ứng dụng.
Chỉ một trong các sự kiện DomainUnload
hoặc ProcessExit
có thể cho miền ứng dụng nhất định, tùy thuộc vào việc đó là miền mặc định (cấp cao nhất) cho quy trình hoặc được tạo dưới dạng tên miền phụ (ví dụ: trên máy chủ web) . Nếu một ứng dụng không biết nó có thể là gì (như trong trường hợp của chúng ta), nó cần phải đăng ký cả hai nếu nó muốn nắm bắt được sự dỡ bỏ thực tế cho chính nó. Ngoài ra, có vẻ như UnhandledException
(trong đó .NET2.0 luôn gây tử vong) có thể ngăn chặn hai sự kiện khác, do đó có thể là trường hợp thứ ba cần xử lý. Ba sự kiện này sẽ hoạt động đối với bất kỳ ứng dụng .NET nào.
Có một thông báo trước rằng thời gian thực hiện cho ProcessExit
bị giới hạn (khoảng 4 giây?), Do đó không thể thực hiện công việc "cuối cùng" mở rộng trong trình xử lý sự kiện đó. Nó cần phải là một cái gì đó có thể được thực hiện một cách nhanh chóng.
Sự kiện Application
chỉ áp dụng cho các ứng dụng WinForms (tuy nhiên chúng tôi cho rằng chúng không thể áp dụng trong các ứng dụng WPF thuần túy). Việc đặt tên có thể gây hiểu lầm bởi vì chúng được đặt tên theo cách sử dụng thông thường cơ bản nhất của chúng có các giả định nhất định. ThreadExit
không liên quan đến thực tế System.Threading.Thread
mà là cho vòng lặp thông báo (Application.Run()
)) của một chuỗi giao diện người dùng và ApplicationExit
tương tự như liên quan đến việc thu thập các biểu mẫu đăng ký trên một hoặc nhiều luồng giao diện người dùng. Thông thường, khi cuộc gọi đến trả về Application.Run()
, được gọi từ phương thức nhập của một chuỗi, phương thức nhập nhanh chóng kết thúc và chính chuỗi đó sẽ kết thúc. Và một khi tất cả các giao diện người dùng đã thoát, một ứng dụng WinForms thường được thực hiện và thoát.
Một sự kiện khác là sự kiện System.Windows.Forms.Application.ThreadException
. Một vòng lặp tin nhắn Windows có thể được cấu hình để bắt ngoại lệ xảy ra trong việc xử lý một tin nhắn và gửi sự kiện này hơn là để cho họ được vô tình (và do đó gây tử vong) trường hợp ngoại lệ. Bắt các ngoại lệ này cho phép vòng lặp tin nhắn (và chuỗi giao diện người dùng) tiếp tục chạy (sau khi hủy bỏ trình xử lý tin nhắn hiện tại). Có thể chỉ có một thuê bao cho sự kiện này vào bất kỳ thời điểm nào cho một chuỗi đã cho (đăng ký ghi đè lên bất kỳ thuê bao nào trước đó) và nó phải được cấu hình trước khi bất kỳ Biểu mẫu nào được tạo và đăng ký trước khi nhập vòng lặp tin nhắn. Xem trợ giúp MSDN cho sự kiện này và System.Windows.Forms.Applicaton.SetUnhandledExceptionMode()
để biết thêm thông tin.
Nguồn
2009-07-20 18:49:31