it-swarm-vi.tech

Tại sao Application.Exit không hoạt động?

Tôi có một ứng dụng đã nhận được các lỗi lạ khi hủy bỏ hộp thoại. Ứng dụng không thể tiếp tục nếu hộp bị hủy, vì vậy nó thoát, nhưng nó không hoạt động vì một số lý do, và do đó nó tiếp tục chạy và gặp sự cố.

Tôi đã gỡ lỗi vấn đề này và bằng cách nào đó, ứng dụng chạy ngay qua lệnh gọi Application.Exit. Tôi đang chạy trong chế độ Gỡ lỗi và điều này có liên quan vì một lượng nhỏ mã phụ thuộc vào biến RELEASE được xác định. Đây là mã thoát ứng dụng của tôi. Tôi đã theo dõi mã và nó đã nhập phương thức ExitApp, và tiếp tục, trả lại quyền điều khiển cho người gọi và cuối cùng bị hỏng.

Đây là một ứng dụng cung cấp các báo cáo qua kết nối máy tính để bàn từ xa, vì vậy đó là lý do tại sao mã thoát hơi lạ. Nó cố gắng chấm dứt phiên từ xa, nhưng chỉ khi chạy dưới bản phát hành vì tôi không muốn tắt máy dev của mình cho mỗi lần chạy thử.

    private void ExitApp()
    {
        HardTerminalExit();
        Application.Exit();
    }

    // When in Debug mode running on a development computer, this will not run to avoid shutting down the dev computer
    // When in release mode the Remote Connection or other computer this is run on will be shut down.
    [Conditional("RELEASE")]
    private void HardTerminalExit()
    {
        WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, false);
    }

Tôi đã chạy trình gỡ lỗi ngay trước dòng Application.Exit và không có gì xảy ra, sau đó kiểm soát trả về cho người gọi sau khi tôi bước qua dòng đó.

Chuyện gì đang xảy ra vậy? Đây là một ứng dụng Windows Forms.

25
Tony Peterson

Đây là một bài viết mở rộng trên cùng một dòng suy nghĩ mà bạn đang trải qua: http://www.dev102.com/2008/06/24/how-do-you-exit-your-net-application/

Về cơ bản: 

  • Môi trường.Exit - Từ MSDN: Chấm dứt quá trình này và cung cấp cho [.__.] Hệ điều hành bên dưới mã [.__.]. Đây là mã [.__.] Để gọi khi bạn đang sử dụng ứng dụng console [.__.].

  • Application.Exit - Từ MSDN: Thông báo cho tất cả các máy bơm thông báo rằng chúng [.__.] Phải chấm dứt, và sau đó đóng tất cả các cửa sổ ứng dụng [.__ Đây là mã [.__.] Để sử dụng nếu bạn được gọi là [.__.] Application.Run (WinForms [.__.] Ứng dụng), phương thức này dừng tất cả [.__ .___.] và đóng tất cả các cửa sổ của ứng dụng [.__.]. Có một số vấn đề [.__.] Về phương pháp này, hãy đọc về [.__.] Trong trang MSDN.

Một cuộc thảo luận khác về điều này: http://geekswithbloss.net/mtreadwell/archive/2004/06/06/6123.aspx

Bài viết này chỉ ra một mẹo hay:

Bạn có thể xác định xem System.Windows.Forms.Application.Run đã được gọi bằng cách kiểm tra thuộc tính System.Windows.Forms.Application.MessageLoop. Nếu đúng, thì Run đã được gọi và bạn có thể giả sử rằng ứng dụng WinForms đang thực thi như sau.

if (System.Windows.Forms.Application.MessageLoop)
{
  // Use this since we are a WinForms app
  System.Windows.Forms.Application.Exit();
}
else
{
  // Use this since we are a console app
  System.Environment.Exit(1);
}
43
GEOCHET

Đã có vấn đề này gần đây (Application.Exit không kết thúc chính xác các máy bơm thông báo cho các biểu mẫu win với Application.Run (Mẫu mới ())), tôi phát hiện ra rằng nếu bạn đang sinh ra các luồng mới hoặc bắt đầu nhân viên nền trong hàm tạo điều này sẽ ngăn Application.Exit chạy.

Di chuyển tất cả các cuộc gọi 'RunWorkerAsync' từ phương thức khởi tạo sang phương thức Tải biểu mẫu:

public Form()
{
  this.Worker.RunWorkerAsync();
}

Chuyển tới:

public void Form_Load(object sender, EventArgs e)
{
  this.Worker.RunWorkerAsync();
}
7
StigM

Hãy thử Environment.Exit(exitCode).

6
Nick Gunn

Tôi đã đi qua tình huống này trong nhiều trường hợp tôi sử dụng Thread.C HiệnThread.Abort ()

và quá trình được đóng lại. Có vẻ như Application.Exit không kết nối đúng với luồng hiện tại.

3
Ahmet Murati

Cũng đảm bảo mọi luồng chạy trong ứng dụng của bạn có thuộc tính IsBackground được đặt thành true. Các luồng không nền sẽ dễ dàng chặn ứng dụng thoát. 

2
Andrew

Hãy chắc chắn rằng bạn không có Console.ReadLine (); trong ứng dụng và Môi trường của bạn.Exit (1); sẽ làm việc và đóng ứng dụng của bạn.

2
Mark Bad

Thử đi : 

trong tệp Program.cs: 

sau Application.Run (mẫu mới ());

thêm Application.Exit ();

0
Ali Gh

Ứng dụng này có chạy (trong phương thức Main) bằng cách sử dụng Application.Run() không? Nếu không, Application.Exit() sẽ không hoạt động.

Nếu bạn đã viết phương thức Main của riêng bạn và bạn muốn dừng ứng dụng, bạn chỉ có thể dừng bằng cách quay lại từ phương thức Main (hoặc giết tiến trình).

0
configurator