Làm thế nào để thoát đúng ứng dụng C #?


197

Tôi có một ứng dụng được xuất bản trong C #. Vấn đề ở đây là bất cứ khi nào tôi đóng biểu mẫu chính bằng cách nhấp vào nút thoát màu đỏ, nó sẽ đóng biểu mẫu nhưng nó không đóng ứng dụng. Tôi phát hiện ra điều này khi tôi cố gắng tắt máy tính, hy vọng rằng ứng dụng tôi tạo ra đang hoạt động trơn tru sau đó tôi bị bắn phá bởi rất nhiều cửa sổ trẻ em mà tôi đã đặt MessageBoxCảnh báo.

Tôi đã thử Application.Exitnhưng nó vẫn gọi tất cả các cửa sổ con và cảnh báo và tôi không biết cách sử dụng Environment.Exitvà số nguyên nào sẽ được đưa vào.

Nhân tiện, bất cứ khi nào biểu mẫu của tôi gọi formclosedhoặc form closingsự kiện tôi đóng ứng dụng bằng một this.Hide()chức năng; Điều đó có ảnh hưởng đến cách ứng dụng của tôi đang hoạt động không?


2
Không xử lý FormCloses hoặc FormClose
SLaks

1
Vì vậy, bạn nói rằng bạn chỉ ẩn các hình thức thay vì đóng chúng? Đó có lẽ là lý do ứng dụng không chấm dứt, nó vẫn có các hình thức mở (ẩn).
Xint0

Sau đó, tôi nên thay thế tất cả cái này. Ẩn () thành cái này. Đóng ()?
John Ernest Guadalupe

1
Bạn không cần Ẩn () hoặc Đóng ().
Henk Holterman

1
Đăng mã liên quan đến các hành động và sự kiện Đóng.
Henk Holterman

Câu trả lời:


329

Từ MSDN:

Ứng dụng. Thoát

Thông báo cho tất cả các máy bơm tin nhắn rằng chúng phải chấm dứt, và sau đó đóng tất cả các cửa sổ ứng dụng sau khi các tin nhắn đã được xử lý. Đây là mã để sử dụng nếu bạn được gọi là Application.Run (ứng dụng WinForms), phương thức này dừng tất cả các vòng lặp thông báo đang chạy trên tất cả các luồng và đóng tất cả các cửa sổ của ứng dụng.

Môi trường. Ngoại trừ

Chấm dứt quá trình này và cung cấp cho hệ điều hành cơ bản mã thoát được chỉ định. Đây là mã để gọi khi bạn đang sử dụng ứng dụng console.

Bài viết này, Application.Exit so với Môi trường.Exit , hướng đến một mẹo hay:

Bạn có thể xác định nếu System.Windows.Forms.Application.Runđã được gọi bằng cách kiểm tra System.Windows.Forms.Application.MessageLooptài sản. 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) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

Tham khảo: Tại sao Application.Exit không hoạt động?


Điều này thực sự hữu ích đối với tôi vì tôi có một ứng dụng WinForms có một đối số để nó có thể chạy một cách im lặng và do đó không hiển thị một biểu mẫu. Khi biểu mẫu bị ẩn sau đó Application.Exit()không thể thoát khỏi ứng dụng, tuy nhiên Environment.Exit(1)hoạt động như một lá bùa.
Dib

5
Câu hỏi không đề cập đến việc thoát do lỗi, vì vậy mã thoát phải bằng 0: Environment.Exit(0) Bất kỳ giá trị khác không nào cũng có nghĩa là mã lỗi dành riêng cho ứng dụng có thể được sử dụng bởi tập lệnh để thực hiện hành động thích hợp. (Đây là mã mới và ứng dụng WinForms, vì vậy không có vấn đề gì trong trường hợp này, nhưng nên biết cho bất kỳ ai viết công cụ dòng lệnh.)
YipYip

Environment.Exitcó thể được sử dụng cho các hình thức ứng dụng quá.
Badiparmagi

1
Sửa lỗi cho tôi nếu tôi sai nhưng tôi nghĩ rằng một returntuyên bố sau đó sẽ cải thiện phương pháp này rất nhiều. Theo tôi hiểu mã sẽ tiếp tục thực thi sau khi Application.Exit()đến một returncâu lệnh.
Bighted19

17

Tôi biết đây không phải là vấn đề bạn gặp phải, tuy nhiên một lý do khác có thể xảy ra là bạn có một luồng không mở trong ứng dụng của mình.

using System;
using System.Threading;
using System.Windows.Forms;

namespace Sandbox_Form
{
    static class Program
    {
        private static Thread thread;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            thread = new Thread(BusyWorkThread);
            thread.IsBackground = false;
            thread.Start();

            Application.Run(new Form());

        }

        public static void BusyWorkThread()
        {
            while (true)
            {
                Thread.Sleep(1000);
            }
        }
    }
}

Khi IsBackgroundfalsenó sẽ giữ cho chương trình của bạn mở cho đến khi Hoàn thành chủ đề, nếu bạn thiết lập IsBackgroundđể truethread sẽ không giữ cho chương trình mở. Những thứ như BackgroundWoker, ThreadPoolTasktất cả nội bộ sử dụng một chủ đề với IsBackgroundthiết lập true.


14

Tất cả bạn cần là System.Environment.Exit(1);

Và nó sử dụng không gian tên hệ thống "bằng cách sử dụng hệ thống" luôn luôn có sẵn khi bạn bắt đầu một dự án.


2
Nó chỉ phù hợp hơn cho các ứng dụng console.
Nidhin David

Một điều cần lưu ý là các sự kiện FormClose / FormCloses sẽ không được gọi cho Môi trường. Ngoài ra, exitCode chỉ nên khác không nếu xảy ra lỗi,
Raphael Smit

9

Tôi sẽ làm một trong những điều sau đây:

Ứng dụng.Exit ();

cho một winform hoặc

Môi trường.Exit (0);

cho một ứng dụng giao diện điều khiển (cũng hoạt động trên winforms).

Cảm ơn!


Môi trường.Exit (0) cũng hoạt động cho WinForms, tồn tại ứng dụng mà không ném bất kỳ ngoại lệ nào.
MulleOne

8

Nhân tiện. Bất cứ khi nào các biểu mẫu của tôi gọi sự kiện đóng biểu mẫu hoặc đóng biểu mẫu, tôi sẽ đóng ứng dụng bằng hàm this.Hide (). Điều đó có ảnh hưởng đến cách ứng dụng của tôi đang hoạt động không?

Tóm lại, vâng. Toàn bộ ứng dụng sẽ chấm dứt khi các hình thức chính (dưới hình thức bắt đầu qua Application.Runtrong Mainphương pháp) được đóng lại (không ẩn).

Nếu toàn bộ ứng dụng của bạn phải luôn chấm dứt hoàn toàn bất cứ khi nào biểu mẫu chính của bạn bị đóng thì bạn chỉ nên xóa trình xử lý biểu mẫu đã đóng đó. Bằng cách không hủy bỏ sự kiện đó và chỉ để chúng hình thành khi người dùng đóng nó, bạn sẽ có được hành vi mong muốn của mình. Đối với tất cả các biểu mẫu khác, nếu bạn không có ý định hiển thị cùng một thể hiện của biểu mẫu đó, bạn chỉ cần để chúng đóng lại, thay vì ngăn chặn và ẩn chúng. Nếu bạn đang hiển thị lại chúng, sau đó ẩn chúng có thể ổn.

Nếu bạn muốn người dùng có thể nhấp vào "x" cho biểu mẫu chính của mình, nhưng có một biểu mẫu khác vẫn mở và thực tế, trở thành biểu mẫu chính "mới", thì phức tạp hơn một chút. Trong trường hợp như vậy, bạn sẽ chỉ cần ẩn biểu mẫu chính của mình thay vì đóng nó, nhưng bạn sẽ cần thêm một số cơ chế thực sự sẽ đóng biểu mẫu chính khi bạn thực sự muốn ứng dụng của mình kết thúc. Nếu đây là tình huống mà bạn gặp phải thì bạn sẽ cần thêm chi tiết vào câu hỏi của mình để mô tả loại ứng dụng nào nên và không thực sự kết thúc chương trình.


3

Bạn có làm không

Application.Run(myForm);

trong Main () của bạn?

Tôi thấy đó là một cách rất dễ dàng để tắt ứng dụng khi đóng biểu mẫu.


1
vâng, nó có Application.Run trong tệp Program.cs trong Main. Tôi phải làm gì để đóng nó sau đó?
John Ernest Guadalupe

Nhưng bạn đã vượt qua hình thức chính của bạn để chạy, phải không? Biểu mẫu bạn đóng bằng cách nhấp vào X. màu đỏ
LightStriker

vâng tôi có nó Nó giống như vậy: Application.Run (new Form2 ());
John Ernest Guadalupe

Trong trường hợp đó, nếu biểu mẫu chính được chuyển đến Run thực sự bị đóng hoàn toàn, ứng dụng sẽ tự động thoát. Sau đó, bạn phải theo dõi lý do tại sao biểu mẫu đó vẫn mở, chạy hoặc ẩn ở đâu đó.
LightStriker

3
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error

-4

Trong trường hợp này, cách thích hợp nhất để thoát ứng dụng để ghi đè phương thức onExit () trong App.xaml.cs:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}

Điều đó cho phép bạn thực thi mã bất cứ khi nào sự kiện thoát xảy ra, nhưng thực tế không khiến sự kiện thoát xảy ra.
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.