Вопрос по c#, .net, visual-studio-2008 – Application.Exit

20

Я использую VSTS 2008 + .Net 3.5 + C # для разработки приложения Windows Forms. Мое замешательство, кажется, Application.Exit не заставляет приложение завершаться? Если нет, какой метод мне следует вызвать, чтобы приложение прекратило работу?

РЕДАКТИРОВАТЬ 1:

Обычно метод main выглядит следующим образом: как изящно выйти из функции Main без вызова Environment.Exit?

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        try
        {
            Application.Run(new Form1());
        }
        catch (Exception ex)
        {
            Console.WriteLine (ex.Message);
        }
    }

заранее спасибо, Джордж

Повторное редактирование - в вашей форме просто вызовите Close (); Marc Gravell♦
Что не так сEnvironment.Exit(Environment.ExitCode)? stackptr
Марк, я прочитал твой ответ, но куда звонить Клоузу? Внутри Main или замените код для вызова Application.Exit на код для вызова Close? George2

Ваш Ответ

6   ответов
4

Application.Exit есть (очевидно) что-то, что препятствует этому. Это может быть что угодно из настройки формыe.Cancel = true вFormClosing событие для потока, который не является фоновым потоком, который все еще работает. Я бы посоветовал вам тщательно исследовать, что именно поддерживает ваш процесс, и хорошенько закрыть его. Это также должно сделать ваше приложение красивым.

Как правило, в приложении winforms должно быть достаточно закрыть основную форму.

Если это так, рассмотрите возможность добавления некоторых механизмов сигнализации (EventWaitHandle), чтобы уведомить эти потоки о том, что они должны завершиться. Затем присоединитесь к ним и подождите, пока они не закончат. (Это лучше, чем сделать их фоновыми и убить их автоматически)
Вы имеете в виду, что если все потоки, которые я создал явно, помечены как фоновые, то приложение должно завершиться после вызова Application.Exit? George2
@ George2: невозможно сказать, но если бы я сидел с кодом и информацией, которая у меня есть сейчас, это была бы моя первая ставка.
Благодаря @Fredrik, когда я вызываю Application.Exit, выполняются некоторые не фоновые потоки (они создаются мной явно с использованием new Thread (). Start ()), как вы думаете, это причина явного создания потоков, которые блокирует выход моего приложения (при вызове Application.Exit ())? George2
@ George2: по крайней мере, они не будут поддерживать приложение, будучи приоритетными; Могут быть и другие причины, по которым он не выходит, но это одно место, чтобы проверить. Однако я думаю, что значением по умолчанию для Thread.IsBackground является false. Хотя стоит проверить.
-1

что все, что вам нужно сделать, - это просто сделать application.exit, а все, что вам нужно сделать, это вставить Конец Достаточно просто команда End закрывает его

Ах, прости, тогда я не знаю
Это действительно не отвечает на вопрос. Среди прочего, вы не говорите, чтоEnd средства. Вы имеете в виду VB.NET? Вопрос о C #.
35

Application.Exit на самом деле просто очень мягко просит цикл сообщений.

Если вы хотите, чтобы ваше приложение закрывалось, лучший способ - это изящно сделать его изMainи аккуратно закройте все дополнительные не фоновые темы.

Если вы хотите быть жестоким ...Environment.Exit или жеEnvironment.FailFast? note это грубо - примерно так же, как убить себяProcess.

Спасибо Марк, 1. Мне интересно узнать, что на самом деле делает Application.Exit - просто отключить передачу сообщений и больше не выполнять никаких функций (например, завершить работу приложения)? 2. Если Application.Exit не имеет функции для завершения приложения Windows Forms, почему, если мы устанавливаем свойство другого потока для потоков backgourd, после вызова Application.Exit приложение будет завершено? George2
Спасибо Марк, я запутался, как изящно выйти из функции Main. Я разместил свой код в своем исходном сообщении в разделе EDIT 1. Есть идеи почему? George2
+1 за отличную персонификацию
Либо ;-p Предположительно, однако, вы находитесь в форме, когда хотите выйти (возможно, в виде кнопки и т. Д.), Поэтому форма может выдать this.Close () для себя.
Марк, я прочитал твой ответ, но куда звонить Клоузу? Внутри Main или замените код для вызова Application.Exit на код для вызова Close? George2
16

Попробуйте следующее:

Process.GetCurrentProcess().Kill();

Environment.Exit не работает с Winforms иEnvironment.FailFast бросает свое собственное исключение.

1

когда я обнаружил открытие новой формы / окна в программе, и только скрытие этой второй формы (не закрытие ее) не позволит правильно завершить основную форму через Application.Exit ();

В этом случае есть два решения. Во-первых, просто используйте Close () в главной форме вместо Application.Exit (). Второе решение заключается в использовании следующего кода:

if (secondForm != null && !secondForm.IsDisposed) secondForm.Dispose();
mainForm.Close () работает для меня. У меня было скрытое окно, которое вызывало эту проблему. В чем разница между Close () и Application.Exit ()?
2

if (System.Windows.Forms.Application.MessageLoop)
{
   // Use this since we are a WinForms app
   System.Windows.Forms.Application.Exit();
}
else
{
   // Use this since we are a console app
   System.Environment.Exit(1);
}

отhttp://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

Спасибо, Питер, 1. Мне интересно узнать, что на самом деле делает Application.Exit - просто отключить передачу сообщений и больше не выполнять никаких функций (например, завершить работу приложения)? 2. Если Application.Exit не имеет функции для завершения приложения Windows Forms, почему, если мы устанавливаем свойство другого потока для потоков backgourd, после вызова Application.Exit приложение будет завершено? George2
Привет, Джордж2, из MSDN: 1. Application.Exit Сообщает всем сообщениям о том, что они должны прекратить работу, а затемcloses all application windows после того, как сообщения были обработаны. 2. имеет функцию завершения / закрытия

Похожие вопросы