Bagaimana cara keluar dari aplikasi C # dengan benar?


197

Saya memiliki aplikasi yang diterbitkan dalam C #. Masalahnya di sini adalah setiap kali saya menutup formulir utama dengan mengklik tombol keluar merah, itu menutup formulir tetapi tidak menutup aplikasi. Saya mengetahui hal ini ketika saya mencoba mematikan komputer, berharap aplikasi yang saya buat berjalan dengan lancar kemudian saya dihujani oleh banyak jendela anak yang saya gunakan untuk memasang MessageBoxAlerts.

Saya mencoba Application.Exittetapi masih memanggil semua jendela anak dan lansiran dan saya tidak tahu cara menggunakan Environment.Exitdan bilangan bulat mana yang harus dimasukkan.

Omong-omong, setiap kali formulir saya memanggil formclosedatau form closingacara saya menutup aplikasi dengan this.Hide()fungsi; Apakah itu memengaruhi perilaku aplikasi saya sekarang?


2
Jangan menangani FormClosed atau FormClosing
SLaks

1
Jadi Anda mengatakan Anda hanya menyembunyikan formulir daripada menutupnya ? Itu mungkin alasan aplikasi tidak berhenti, masih memiliki bentuk terbuka (tersembunyi).
Xint0

Maka saya harus mengganti semua ini. Sembunyikan () ke ini. Tutup ()?
John Ernest Guadalupe

1
Anda tidak perlu Sembunyikan () atau Tutup ().
Henk Holterman

1
Poskan kode tentang tindakan dan acara Tutup.
Henk Holterman

Jawaban:


329

Dari MSDN:

Aplikasi. Keluar

Menginformasikan semua pompa pesan bahwa mereka harus mengakhiri, dan kemudian menutup semua jendela aplikasi setelah pesan diproses. Ini adalah kode yang digunakan jika Anda dipanggil Application.Run (aplikasi WinForms), metode ini menghentikan semua loop pesan yang berjalan di semua utas dan menutup semua jendela aplikasi.

Lingkungan. Keluar

Hentikan proses ini dan berikan kode keluar yang ditentukan sistem operasi yang mendasarinya. Ini adalah kode untuk dihubungi saat Anda menggunakan aplikasi konsol.

Artikel ini, Application.Exit vs Environment.Exit , menunjukkan tip yang bagus:

Anda dapat menentukan apakah System.Windows.Forms.Application.Runtelah dipanggil dengan memeriksa System.Windows.Forms.Application.MessageLoopproperti. Jika benar, maka Jalankan telah dipanggil dan Anda dapat menganggap bahwa aplikasi WinForms sedang mengeksekusi sebagai berikut.

if (System.Windows.Forms.Application.MessageLoop) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

Referensi: Mengapa Application.Exit gagal berfungsi?


Ini sangat berguna bagi saya karena saya memiliki aplikasi WinForms yang memiliki argumen sehingga dapat berjalan secara diam-diam dan karena itu tidak menunjukkan formulir. Ketika formulir disembunyikan kemudian Application.Exit()gagal keluar dari aplikasi, namun Environment.Exit(1)berfungsi seperti pesona.
Dib

5
Pertanyaan tidak menyebutkan keluar karena kesalahan, jadi kode keluar harus nol: Environment.Exit(0) Setiap nilai bukan-nol dimaksudkan sebagai kode kesalahan khusus aplikasi yang dapat digunakan oleh skrip untuk mengambil tindakan yang sesuai. (Ini adalah kode baru dan aplikasi WinForms, jadi tidak mungkin menjadi masalah dalam kasus ini, tetapi baik untuk diketahui bagi siapa pun yang menulis alat baris perintah.)
YipYip

Environment.Exitdapat digunakan untuk aplikasi formulir juga.
Badiparmagi

1
Perbaiki saya jika saya salah, tetapi saya pikir returnpernyataan setelahnya akan banyak meningkatkan pendekatan ini. Seperti yang saya pahami kode akan melanjutkan eksekusi setelah Application.Exit()sampai returnpernyataan.
Bighted19

17

Saya tahu ini bukan masalah yang Anda miliki, namun alasan lain ini bisa terjadi adalah Anda membuka utas non latar di aplikasi Anda.

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);
            }
        }
    }
}

Ketika IsBackgroundadalah falseitu akan menjaga program anda buka sampai selesai benang, jika Anda mengatur IsBackgrounduntuk truebenang tidak akan menjaga program terbuka. Hal-hal seperti BackgroundWoker,, ThreadPooldan Tasksemua internal menggunakan utas dengan IsBackgroundset ke true.


14

Yang kamu butuhkan adalah System.Environment.Exit(1);

Dan ia menggunakan namespace sistem "menggunakan Sistem" yang hampir selalu ada ketika Anda memulai sebuah proyek.


2
Lebih cocok untuk aplikasi konsol saja.
Nidhin David

Satu hal yang perlu diperhatikan adalah acara FormClosing / FormClosed tidak akan dipanggil untuk Environment.Exit juga exitCode hanya boleh bukan nol jika terjadi kesalahan,
Raphael Smit

9

Saya akan melakukan salah satu dari yang berikut:

Aplikasi.Keluar ();

untuk winform atau

Lingkungan.Keluar (0);

untuk aplikasi konsol (juga berfungsi pada winforms).

Terima kasih!


Environment.Exit (0) bekerja untuk WinForms juga, ada aplikasi tanpa membuang pengecualian.
MulleOne

8

Ngomong-ngomong. kapan saja formulir saya memanggil acara ditutup form atau bentuk saya menutup applciation dengan fungsi this.Hide (). Apakah itu memengaruhi perilaku aplikasi saya sekarang?

Singkatnya, ya. Seluruh aplikasi akan berakhir ketika formulir utama (formulir dimulai melalui Application.Rundalam Mainmetode) ditutup (tidak disembunyikan).

Jika seluruh aplikasi Anda harus selalu berakhir sepenuhnya setiap kali formulir utama Anda ditutup, maka Anda hanya perlu menghapus formulir itu penangan tertutup. Dengan tidak membatalkan acara itu dan membiarkannya menutup ketika pengguna menutupnya, Anda akan mendapatkan perilaku yang Anda inginkan. Adapun semua bentuk lainnya, jika Anda tidak berniat menunjukkan contoh yang sama lagi, Anda cukup membiarkannya ditutup, alih-alih mencegah penutupan dan menyembunyikannya. Jika Anda menunjukkannya lagi, menyembunyikannya mungkin baik-baik saja.

Jika Anda ingin agar pengguna mengklik "x" untuk formulir utama Anda, tetapi biarkan formulir lain tetap terbuka dan, pada dasarnya, menjadi bentuk utama "baru", maka itu sedikit lebih rumit. Dalam kasus seperti itu, Anda hanya perlu menyembunyikan formulir utama daripada menutupnya, tetapi Anda harus menambahkan semacam mekanisme yang benar - benar akan menutup formulir utama saat Anda benar-benar ingin aplikasi Anda berakhir. Jika ini situasi yang Anda hadapi maka Anda perlu menambahkan lebih banyak detail pada pertanyaan Anda yang menjelaskan jenis aplikasi apa yang harus dan tidak seharusnya mengakhiri program.


3

Lakukan apa yang kamu lakukan:

Application.Run(myForm);

di Main Anda ()?

Saya menemukan ini cara yang sangat mudah untuk mematikan aplikasi ketika formulir ditutup.


1
ya itu memang Application.Run dalam file Program.cs di Main. Apa yang harus saya lakukan untuk menutupnya?
John Ernest Guadalupe

Tetapi Anda melewati formulir utama Anda untuk Berlari, bukan? Formulir yang Anda tutup dengan mengeklik X merah.
LightStriker

ya saya memilikinya Pak. Seperti: Application.Run (Form2 baru ());
John Ernest Guadalupe

Dalam hal ini, jika formulir utama yang diteruskan ke Run benar-benar tertutup, aplikasi akan keluar secara otomatis. Anda kemudian harus melacak mengapa formulir itu masih terbuka, berjalan, atau disembunyikan di suatu tempat.
LightStriker

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

-4

Dalam hal ini, cara yang paling tepat untuk keluar dari aplikasi untuk mengganti metode onExit () di App.xaml.cs:

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

Itu memungkinkan Anda untuk mengeksekusi kode setiap kali peristiwa keluar terjadi, tetapi sebenarnya tidak menyebabkan peristiwa keluar terjadi.
jpaugh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.