2008-10-03 33 views
5

Chúng tôi có SmartClient được cài sẵn trong C# mà vẫn còn mở khi máy tính đang chạy đang được khởi động lại. Điều này ngăn chặn quá trình khởi động lại trừ khi người dùng đóng SmartClient lần đầu tiên hoặc có một số can thiệp thủ công khác.C# .Net exe không đóng khi PC được khởi động lại, giữ cho máy không khởi động lại

Điều này gây ra sự cố khi nhóm cơ sở hạ tầng cài đặt từ xa phần mềm mới yêu cầu khởi động lại máy.

Bất kỳ ý tưởng nào để ứng dụng SmartClient nhận ra sự kiện tắt/khởi động lại từ Windows và tự xóa chính nó?

CẬP NHẬT: Đây là ứng dụng có luồng cao với nhiều chủ đề gui. có, nhiều chủ đề gui. Nó thực sự là một hợp nhất của nhiều dự án mà trong và của mình có thể là các ứng dụng độc lập - tất cả đều được khởi chạy và quản lý từ một exe đơn để tập trung các phương thức quản lý đó và theo dõi các luồng đó. Tôi không tin rằng sử dụng các chủ đề nền là một lựa chọn.

+0

Bạn có đang chạy nội dung trên các chủ đề không phải nền không? – Will

+0

Bạn có quyền truy cập vào mã nguồn cho ứng dụng SmartClient không? –

Trả lời

5

OK, nếu bạn có quyền truy cập vào các ứng dụng, bạn có thể xử lý các sự kiện SessionEnded.

... 
Microsoft.Win32.SystemEvents.SessionEnded +=new 
    Microsoft.Win32.SessionEndedEventHandler(shutdownHandler); 

... 

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) { 
    // Do stuff 
} 
+1

Chỉ cần lưu ý: Bạn có thể muốn sự kiện SessionEndING, không phải là SessionEnded (nếu bạn cần hủy bỏ các chủ đề và các biểu mẫu đóng vv). – Sire

+0

+1 để tìm hiểu điều gì đó mới mẻ. – Ikaso

0

Thông thường ứng dụng .Net sẽ phản hồi chính xác - ít nhất, đó là hành vi 'ngoài hộp'. Nếu không, có thể có một số thứ đang diễn ra. Đoán tốt nhất của tôi mà không biết bất cứ điều gì thêm về chương trình của bạn là bạn có một quy trình chạy dài trong chuỗi giao diện người dùng chính ngăn ứng dụng phản hồi các thông báo cửa sổ.

+0

Không phải các quy trình chạy dài nhưng có luồng như Catalin đã đề cập ở trên. Tuy nhiên, điều đó không thực sự trả lời câu hỏi - tôi thực sự đang tìm kiếm một cách để phát hiện khi máy đang được khởi động lại. – ScottCher

1

Hoặc có thể ứng dụng .Net đang bỏ qua thông báo đóng hoặc thoát khỏi mục đích?

+0

Đây là một nhận xét imo – Konstantinos

5

Nó phải là một chuỗi tiếp tục chạy để ngăn ứng dụng của bạn đóng lại. Nếu bạn đang sử dụng luồng một sửa chữa dễ dàng sẽ được thiết lập để nền.

Chủ đề là chủ đề nền hoặc chuỗi tiền cảnh. Các chủ đề nền giống hệt với các chủ đề nền trước, ngoại trừ các chủ đề nền không ngăn cản quá trình chấm dứt. Khi tất cả các luồng tiền cảnh của một tiến trình đã chấm dứt, thời gian chạy ngôn ngữ chung kết thúc quá trình. Mọi chủ đề nền còn lại đều bị dừng và không hoàn thành.

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

+0

Thực vậy, đây là một ứng dụng được tạo luồng. Xem cập nhật cho bài đăng gốc. Tuy nhiên, cho những gì chúng tôi đang làm với các chủ đề, là nền họ vẫn còn tồn tại? Tức là, nhiều chủ đề GUI. – ScottCher

1

đề Bối cảnh là một giải pháp nhanh chóng và dơ bẩn, giải pháp tốt nhất là sử dụng đối tượng đồng bộ (ManualResetEvent, Mutex hay cái gì khác) để ngăn chặn các chủ đề khác;

Hoặc theo dõi tất cả các cửa sổ đã mở của bạn và gửi thông báo WM_CLOSE khi ứng dụng chính đóng.

Bạn phải cung cấp thêm thông tin về cách bạn khởi động các ứng dụng GUI đó. có thể bạn bắt đầu một sợi cho mỗi ứng dụng và gọi Application.Run(new Form1());?

Bạn cũng có thể xem xét việc tạo một AppDomain cho mỗi ứng dụng GUI

5

Khi người dùng đang đăng nhập tắt hoặc Windows đã được đóng cửa, WM_QUERYENDSESSION thông điệp được gửi đến tất cả các cửa sổ cấp cao nhất.Xem MSDN documentation here.

Hành vi mặc định của ứng dụng WinForm để phản hồi thông báo này là kích hoạt sự kiện FormClosing với CloseReason == WindowsShutDown hoặc các sự kiện khác. Trình xử lý sự kiện mặc dù có thể chọn cứng đầu và từ chối tắt ứng dụng, do đó giữ cho hệ thống hoạt động.

Kiểm tra FormClosing trình xử lý ứng dụng của bạn. Có lẽ có cái gì đó trong đó. Tôi đã nhìn thấy loại công cụ này một vài lần.

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