2011-12-15 26 views
5

Dưới đây là một đoạn mã mà tôi bật lên một hộp thoại đơn giản ("chooser"). Tùy thuộc vào đầu vào của người dùng, ứng dụng có thể chấm dứt.Tại sao chương trình C# WPF của tôi tiếp tục thực hiện các dòng sau khi Application.Shutdown()?

DPChooser chooser = new DPChooser(dataProvider); 
    if (chooser.ShowDialog() == false) 
     Application.Current.Shutdown(0); 
    else 
     ApplicationContext.Current.InitializeDataProviderAPI(chooser.DataProvider); 
    } 

    // more code continues here 
    // THE PROBLEM: 
    //  Even when Shutdown() above is called, 
    //  the execution continues proceeding past here! 

Tôi đã chạy nó trong một trình gỡ lỗi, vì vậy tôi biết rằng nếu được đánh giá là false, và tôi biết Shutdown mà() được gọi.

Vậy tại sao nó không tắt?

Lưu ý: đó không phải là vấn đề mà tôi nghĩ. Tôi chưa bắt đầu bất cứ điều gì về chủ đề khác. Ngay cả khi luồng đã được tham gia, tôi vẫn không mong đợi mã trong chuỗi này để tiếp tục quá trình Shutdown().

Trả lời

10

Tắt máy dừng xử lý Bộ điều phối và đóng ứng dụng theo như WPF có liên quan, nhưng không thực sự giết luồng hiện tại.

Trong trường hợp của bạn, bạn cần phải ngăn mã vượt quá cuộc gọi đó để chạy. Một trở lại đơn giản sẽ đủ:

if (chooser.ShowDialog() == false) 
{ 
    Application.Current.Shutdown(0); 
    return; 
} 
else { //... 
+0

Heh, đó là không phải như vậy trực quan. Tôi nên nghĩ rằng chỉ cần đặt một trở lại ở đó, mặc dù, duh vào tôi. Cảm ơn. –

+0

Chờ, tài liệu cho Tắt máy (int exitCode) nói rằng exitCode được trả về hệ điều hành. Nếu phương pháp này không thực sự giết ứng dụng, làm thế nào ứng dụng có thể sử dụng nó để trả về exitCode này? –

+0

@GrantB Đó là một tắt máy được kiểm soát, điều này không ngăn chặn chuỗi thực thi. Nếu bạn đang sử dụng hệ thống ống nước WPF mặc định, thì mã thoát này là những gì được trả về từ điểm vào, nhưng nó xảy ra sau khi mọi thứ khác thực hiện (như bạn đã phát hiện ở đây). –

2

Nó không chấm dứt quá trình của bạn ngay lập tức, tắt máy được kiểm soát của nó.

nếu bạn muốn (không khuyến khích) để giết ngay lập tức

Process.GetCurrentProcess().Kill(); 
+0

Environment.Exit() cũng hoạt động, nhưng tôi biết nó không kém phần mong muốn. –

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