Як правильно вийти із програми C #?


198

У мене є опублікована заявка на C #. Проблема тут полягає в тому, що коли я закриваю основну форму, натискаючи на червону кнопку виходу, вона закриває форму, але програму не закриває. Я дізнався це, коли спробував вимкнути комп’ютер, сподіваючись, що додаток, який я зробив, працює безперебійно, тоді мене обстріляло багато дитячих вікон, з якими я поставив MessageBoxпопередження.

Я спробував, Application.Exitале він все ще викликає всі дочірні вікна та сповіщення, і я не знаю, як їх використовувати Environment.Exitі яке ціле число ввести в нього.

До речі, щоразу, коли мої форми дзвонять formclosedабо form closingподія, я закриваю програму this.Hide()функцією; Чи впливає це на те, як зараз поводиться моя заява?


2
Не обробляти FormClosed або FormClosing
SLaks

1
Так ви кажете, що ви лише ховаєте форми, а не закриваєте їх? Це, мабуть, причина, коли програма не припиняється, вона все ще має відкриті (приховані) форми.
Xint0

Тоді я повинен замінити все це.Hide () to.Close ()?
Джон Ернест Гуадалупе

1
Вам не потрібно Hide () або Close ().
Хенк Холтерман

1
Розмістіть код щодо закритих дій та подій.
Хенк Холтерман

Відповіді:


330

Від MSDN:

Застосування.Exit

Повідомляє всі насоси повідомлень про те, що вони повинні припинятися, а потім закриває всі вікна програм після обробки повідомлень. Це код, який потрібно використовувати, якщо ви викликали Application.Run (програми WinForms), цей спосіб зупиняє всі запущені петлі повідомлень у всіх потоках і закриває всі вікна програми.

Навколишнє середовище

Припиняє цей процес і надає базовій операційній системі вказаний код виходу. Це код для дзвінка, коли ви використовуєте консольний додаток.

Ця стаття Application.Exit vs. Environment.Exit вказує на гарну підказку:

Ви можете визначити, чи System.Windows.Forms.Application.Runвикликали виклик, перевіривши System.Windows.Forms.Application.MessageLoopвластивість. Якщо це правда, тоді викликається запуск, і ви можете припустити, що програма WinForms виконує наступним чином.

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

Довідка: Чому Application.Exit не працює?


Це було дуже корисно для мене, оскільки у мене був додаток WinForms, який мав аргумент, щоб він міг працювати безшумно і тому не показував форму. Коли форма була прихована, тоді Application.Exit()не вдалося вийти з програми, однак Environment.Exit(1)працювало як шарм.
Діб

5
Питання не згадувало про вихід із-за помилки, тому код виходу повинен бути нульовим: Environment.Exit(0) будь-яке ненульове значення має на увазі специфічний код помилки програми, який може бути використаний сценарієм для відповідних дій. (Це новий код та програма WinForms, тому навряд чи це матиме значення в цьому випадку, але добре знати, хто пише інструменти командного рядка.)
YipYip

Environment.Exitможе використовуватися і для застосування форм.
Бадіпармагі

1
Виправте мене, якщо я помиляюся, але думаю, що returnтвердження після цього значно покращить цей підхід. Як я зрозумів, код буде продовжувати виконання після Application.Exit()закінчення returnзаяви.
Подивився19

17

Я знаю, що це не проблема, яку ви мали, проте ще одна причина, що це може статися, - це те, що у вашій програмі відкрита не фонова нитка.

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

Коли IsBackgroundце falseбуде тримати вашу програму відкриті до різьблення Завершує, якщо ви встановите IsBackgroundна trueрізьблення не буде тримати програму відкритою. Такі речі, як BackgroundWoker, ThreadPoolі Taskвсі внутрішньо використовують потік із IsBackgroundвстановленим на true.


14

Все, що тобі потрібно, це System.Environment.Exit(1);

І він використовує системний простір імен "використання системи", який майже завжди є, коли ви починаєте проект.


2
Його більше підходить тільки для консольних додатків.
Нідхін Давід

Варто зазначити одне, що події FormClosing / FormClosed не будуть викликані для Environment.Exit також exitCode повинен бути ненульовим, якщо сталася помилка,
Raphael Smit

9

Я хотів би один із наступних:

Application.Exit ();

для winform або

Навколишнє середовище.Exit (0);

для консольного додатка (працює і на форматі winform).

Дякую!


Environment.Exit (0) працює і для WinForms, існує додаток без викидів.
MulleOne

8

До речі. всякий раз, коли мої форми викликають подію закритої форми чи закриття форми, я закриваю додаток функцією this.Hide (). Чи впливає це на те, як зараз поводиться моя заява?

Словом, так. Все додаток закінчиться , коли основна форма (форма початку з допомогою Application.Runв Mainметоді) замкнута (не ховає).

Якщо вся ваша заявка завжди повністю припиняється, коли ваша основна форма закрита, вам слід просто видалити закриту оброблювачу форми. Якщо не скасовувати цю подію і просто дати їм закритися, коли користувач закриває її, ви отримаєте бажану поведінку. Що стосується всіх інших форм, якщо ви не збираєтесь знову показувати той самий екземпляр форми, ви просто дозволите їх закрити, а не запобігати закриттю та приховуванню. Якщо ви їх знову показуєте, то їх приховування може бути нормальним.

Якщо ви хочете, щоб користувач міг натиснути "x" для вашої основної форми, але інша форма залишається відкритою і, фактично, стає "новою" основною формою, тоді це трохи складніше. У такому випадку вам потрібно буде просто приховати основну форму, а не закривати її, але вам потрібно буде додати якийсь механізм, який фактично закриє основну форму, коли ви дійсно хочете, щоб ваша програма закінчилася. Якщо це така ситуація, вам потрібно буде додати більше деталей до свого питання, що описує, які типи програм повинні насправді закінчувати програму.


3

Ви робите:

Application.Run(myForm);

у головному ()?

Я вважав це дуже простим способом вбити додаток, коли форма закрита.


1
так, він має Application.Run у файлі Program.cs в Main. Що мені робити, щоб закрити його тоді?
Джон Ернест Гуадалупе

Але ти передаєш свою основну форму «Бігти», правда? Форма, яку ви закриваєте, натиснувши на червоний X.
LightStriker

так, у мене це є, сер. Це так: Application.Run (новий Form2 ());
Джон Ернест Гуадалупе

У такому випадку, якби основна форма, передана Run, була справді повністю закрита, програма закриється автоматично. Тоді ви повинні відстежити, чому ця форма все ще відкрита, десь запущена чи прихована.
LightStriker


-4

У цьому випадку найбільш правильний спосіб вийти з програми, щоб замінити метод onExit () в App.xaml.cs:

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

Це дозволяє виконувати код щоразу, коли трапляється подія виходу, але насправді не викликає події виходу.
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.