2009-02-09 36 views
5

Thư viện mã của chúng tôi cần được thông báo khi ứng dụng đang thoát. Vì vậy, chúng tôi đã đăng ký với sự kiện System.Window.Forms.Application.ApplicationExit. Điều này làm việc tốt cho các ứng dụng Winforms, nhưng nó cũng làm việc cho các loại ứng dụng khác như ứng dụng console, dịch vụ và ứng dụng web (chẳng hạn như ASP.NET)? Không gian tên sẽ gợi ý rằng nó không, và nó có lẽ được nâng lên khi Application.Exit() được gọi (rõ ràng hoặc ngụ ý), có thể không chính xác để gọi cho những trường hợp khác.Ứng dụng sự kiện Application.ApplicationExit có được thông báo về thoát trong các ứng dụng không phải là Winforms không?

Có sự kiện nào khác sẽ tốt hơn trong các trường hợp khác hoặc sẽ phổ biến hơn (tuyệt vời nếu nó hoạt động cho Winforms)? Ví dụ: có sự kiện nào khi Environment.Exit() được gọi (ứng dụng bảng điều khiển) không?

Tôi tìm thấy đề cập đến sự kiện đã thoát trong System.Diagnostic.Process, nhưng điều này có vẻ như để theo dõi lối ra của quy trình khác và dường như quá trình này không nhận được (ví dụ: , Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;). Tôi nghĩ rằng nó chỉ có thể được nâng lên sau khi quá trình này thực sự đã thoát, vì vậy nó sẽ không hoạt động.

Điều này đặc biệt cho .NET 2.0 và C#.

Trả lời

9

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.

Các vấn đề liên quan