2012-03-02 40 views
16

Điều gì sẽ xảy ra khi tôi ngắt ứng dụng bảng điều khiển C# bằng Control-C?Điều gì xảy ra khi tôi ngắt một ứng dụng giao diện điều khiển C# bằng Control-C?

Quy trình có bị giết không? Bộ nhớ có được giải phóng không? Các khối finally có được thực thi không? Điều gì xảy ra với các kết nối cơ sở dữ liệu?

Có bất kỳ điều này khác nhau nếu ứng dụng được xây dựng để gỡ lỗi hoặc phát hành hoặc chạy bên trong/bên ngoài Visual Studio?

Trả lời

11

ngắn Trả lời: Nó không làm gì sau khi tổ hợp phím CTRL-C

dài trả lời: Có bài viết tốt về nó trên MSDN trong đó nêu rõ, rằng nó sẽ gửi một tín hiệu (ngắt) thay vì bấm phím -sự kiện.

Ngoài ra còn có một cancelKeyPress-Event kích hoạt mà bạn có thể đăng ký và làm bất cứ điều gì bạn muốn!

Thật không may là không có thêm thông tin về, những gì thực sự được thực hiện theo mặc định. Có lẽ trong trường hợp xấu nhất bạn có thể tự mình kiểm tra. Nhưng imo nên có một số tài liệu về nó ...

UPDATE: Alois Kraus viết một cách duyên dáng tắt một ứng dụng bàn điều khiển sau khi nhận được CTRL-C.

Để báo Alois Kraus:

Hành vi mặc định của CLR là để làm gì. Điều này có nghĩa là CLR được thông báo rất muộn bởi một thông báo DLL_PROCESS_DETACH trong đó ngữ cảnh không có mã được quản lý có thể chạy nữa vì khóa trình nạp hệ điều hành đã được thực hiện. Chúng tôi đang ở trong tình huống không may là chúng tôi không nhận được các sự kiện thông báo cũng như không có bất kỳ finalizers nào chạy. Tất cả các chủ đề được âm thầm giết chết mà không có cơ hội để thực hiện đánh bắt của họ/cuối cùng khối để làm một trật tự tắt máy. Tôi nói trong câu đầu tiên mặc định, bởi vì có một cách để xử lý tình trạng này một cách duyên dáng. Lớp Console đã có một thành viên sự kiện mới với .NET 2.0: Console.CancelKeyPress. Nó cho phép bạn nhận được thông báo về các phím Ctrl-C và Ctrl-Break, nơi bạn có thể ngừng tắt máy (chỉ dành cho Ctrl-C, nhưng không phải là Ctrl-Break). Vấn đề chính ở đây là nếu bạn nắm bắt sự kiện Ctrl-C/Break và thoát khỏi trình xử lý, không có trình kết thúc nào được gọi. Đây không phải là những gì tôi sẽ gọi tắt là hợp tác xã. Điều đầu tiên mà tôi nghĩ đến là gọi Environment.Exit nhưng nó không kích hoạt bất kỳ finalizers nào. Tất cả đều không bị mất. Tôi đã đưa ra một thủ thuật bẩn để chạy tất cả các finalizers: chúng tôi quay lên một chút helper thread bên trong xử lý sự kiện mà sau đó sẽ gọi Environment.Exit. Thì đấy, những người kết thúc của chúng ta được gọi.

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