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?

John Ernest Guadalupe
sumber
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?

Furqan Safdar
sumber
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.

Scott Chamberlain
sumber
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.

Omar Moodie
sumber
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!

Techcraft7
sumber
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.

Melayani
sumber
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.

LightStriker
sumber
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
pelet joe
sumber
-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); 
}
Anton Tsches
sumber
Itu memungkinkan Anda untuk mengeksekusi kode setiap kali peristiwa keluar terjadi, tetapi sebenarnya tidak menyebabkan peristiwa keluar terjadi.
jpaugh