Nasıl düzgün bir C # uygulamadan çıkmak için?


198

C # yayınlanan bir uygulama var. Buradaki sorun, kırmızı çıkış düğmesine tıklayarak ana formu kapattığımda, formu kapatıyor ancak uygulamayı kapatmıyor. Bilgisayarı kapatmayı denediğimde bunu öğrendim, umarım yaptığım uygulama sorunsuz çalışıyor, o zaman MessageBoxUyarıları koyduğum birçok çocuk penceresi tarafından bombalandı .

Denedim Application.Exitama hala tüm alt pencereleri ve uyarıları çağırıyor ve nasıl kullanılacağını Environment.Exitve içine hangi tamsayıyı koyacağımı bilmiyorum.

Bu arada, formlarım formclosedveya form closingolayı çağırdığında uygulamayı bir this.Hide()işlevle kapatıyorum ; Bu, başvurumun şimdi nasıl davrandığını etkiler mi?


2
FormClosed veya FormClosing'i kullanmayın
SLaks

1
Yani formları sadece kapatmak yerine sakladığınızı mı söylüyorsunuz ? Muhtemelen uygulamanın sona ermemesinin nedeni, hala açık (gizli) formları vardır.
Xint0

Sonra tüm this.Hide () yerine bu.Close ()?
John Ernest Guadalupe

1
Gizle () veya Kapat () gerekmez.
Henk Holterman

1
Kapat eylemleri ve olayları ile ilgili kodu yayınlayın.
Henk Holterman

Yanıtlar:


330

MSDN'den:

Application.Exit

Tüm ileti pompalarına sonlanmaları gerektiğini bildirir ve iletiler işlendikten sonra tüm uygulama pencerelerini kapatır. Bu, Application.Run (WinForms uygulamaları) olarak adlandırıldığınızda kullanılacak koddur, bu yöntem tüm iş parçacıklarındaki tüm çalışan ileti döngülerini durdurur ve uygulamanın tüm pencerelerini kapatır.

Environment.Exit

Bu işlemi sonlandırır ve temel alınan işletim sistemine belirtilen çıkış kodunu verir. Konsol uygulamasını kullanırken çağıracağınız kod budur.

Bu makalede, Application.Exit ve Environment.Exit , iyi bir ipucunu işaret ediyor:

Özelliği System.Windows.Forms.Application.Runkontrol ederek çağrılıp çağrılmadığını belirleyebilirsiniz System.Windows.Forms.Application.MessageLoop. True olursa, Çalıştır çağrıldı ve WinForms uygulamasının aşağıdaki gibi yürütüldüğünü varsayabilirsiniz.

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

Başvuru: Application.Exit neden çalışmaz?


Sessiz çalışabilmesi ve dolayısıyla bir form göstermemesi için bir argümanı olan bir WinForms uygulamam olduğu için bu benim için gerçekten yararlı oldu. Form gizlendiğinde Application.Exit()uygulamadan çıkılamadı, ancak Environment.Exit(1)bir cazibe gibi çalıştı.
Dib

5
Soru, bir hata nedeniyle çıkıştan bahsetmedi, bu nedenle çıkış kodu sıfır olmalıdır: Sıfır Environment.Exit(0) olmayan herhangi bir değer, uygun eylemi gerçekleştirmek için bir komut dosyası tarafından kullanılabilecek uygulamaya özel bir hata kodu anlamına gelir. (Bu yeni bir kod ve bir WinForms uygulamasıdır, bu nedenle bu durumda önemli değildir, ancak komut satırı araçları yazan herkes için bilmek iyidir.)
YipYip

Environment.Exitform uygulaması için de kullanılabilir.
Badiparmagi

1
Yanılıyorsam beni düzeltin ama returndaha sonra yapılan bir açıklama bu yaklaşımı çok geliştirecektir. Anladığım kadarıyla kod Application.Exit()bir returnifadeye kadar yürütmeye devam edecekti .
Bighted19

17

Ben bu sorun değil biliyorum, ancak bu olabilir başka bir nedeni, açık bir arka plan iş parçacığı açık uygulama olmasıdır.

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

Ne zaman IsBackgroundolduğunu falseo iplik tamamlanıncaya kadar açık Programınızı tutacak, ayarladığınız takdirde IsBackgroundiçin trueiplik açık bir program tutmaz. BackgroundWoker, Gibi şeyler ThreadPoolve Tasktümü dahili olarak IsBackgroundayarlanmış bir iş parçacığı kullanır true.


14

Tum ihtiyacin olan sey System.Environment.Exit(1);

Ve bir projeye başladığınızda hemen hemen her zaman orada bulunan "System'i kullanarak" sistem ad alanını kullanır.


2
Sadece konsol uygulamaları için daha uygundur.
Nidhin David

Dikkat edilmesi gereken bir şey, FormClosing / FormClosed olaylarının Ortam için çağrılmayacağıdır.Exit ayrıca exitCode yalnızca bir hata oluştuğunda sıfırdan farklı olmalıdır,
Raphael Smit

10

Aşağıdakilerden birini yapardım:

Application.Exit ();

bir winform için veya

Environment.Exit (0);

bir konsol uygulaması için (winforms üzerinde de çalışır).

Teşekkürler!


Ortam.Exit (0) WinForms için de çalışır, herhangi bir istisna atmadan uygulama var.
MulleOne

8

Bu arada. ne zaman formlarım formclosed veya form kapatma olayı çağırırsanız ben bir this.Hide () işlevi ile applciation kapatın. Bu, başvurumun şimdi nasıl davrandığını etkiler mi?

Kısacası, evet. Ana form (aracılığıyla başlatılan bir şekilde zaman bütün uygulama sona erecek Application.Runiçinde Mainbir yöntemle) kapalı (gizli olmayan).

Başvurunuzun tamamı ana formunuz her kapandığında tamamen sona ermesi durumunda, bu form kapalı işleyicisini kaldırmanız yeterlidir. Bu etkinliği iptal etmeyerek ve yalnızca kullanıcı kapattığında bunların kapanmasına izin vererek istediğiniz davranışı elde edersiniz. Diğer tüm formlara gelince, formun aynı örneğini tekrar göstermek istemiyorsanız, kapanmayı önlemek ve gizlemek yerine sadece onları kapatmanız yeterlidir. Onları tekrar gösteriyorsanız, onları gizlemek iyi olabilir.

Kullanıcının ana formunuz için "x" i tıklamasını, ancak başka bir formun açık kalmasını ve aslında "yeni" ana form haline gelmesini istiyorsanız, o zaman biraz daha karmaşıktır. Bu durumda, ana formunuzu kapatmak yerine gizlemeniz gerekir, ancak uygulamanızın gerçekten bitmesini istediğinizde ana formu gerçekten kapatacak bir mekanizma eklemeniz gerekir . İçinde bulunduğunuz durum buysa, sorunuza hangi tür uygulamaların gerçekten programı sonlandırması gerektiğini ve sonlandırmaması gerektiğini açıklayan daha fazla ayrıntı eklemeniz gerekir.


3

Yaparmısın:

Application.Run(myForm);

Ana ()?

Form kapatıldığında uygulamayı öldürmenin çok kolay bir yolunu buldum.


1
Evet, Main.Program.cs dosyasında Application.Run var. Kapatmak için ne yapmalıyım?
John Ernest Guadalupe

Ama ana formunuzu Run'a iletirsiniz, değil mi? Kırmızı X'i tıklayarak kapattığınız form
LightStriker

evet bende var efendim. Bu şekilde: Application.Run (yeni Form2 ());
John Ernest Guadalupe

Bu durumda, Çalıştır'a iletilen ana form gerçekten tamamen kapatıldıysa, uygulama otomatik olarak çıkacaktır. Daha sonra bu formun neden hala açık, çalışan veya bir yerde gizli olduğunu izlemelisiniz.
LightStriker

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

-4

Bu durumda, App.xaml.cs dosyasında onExit () yöntemini geçersiz kılmak için uygulamadan çıkmanın en uygun yolu:

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

Bu, bir çıkış olayı gerçekleştiğinde kod çalıştırmanıza izin verir, ancak aslında çıkış olayının gerçekleşmesine neden olmaz.
jpaugh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.