Почему закрытие windows консоли сразу после отображения моего вывода?
Я изучаю C #, следуя инструкциям в MSDN .
Теперь я просто попробовал пример 1 ( вот ссылка на MSDN ), и я столкнулся с проблемой: почему закрытие windows консоли сразу после отображения моего вывода?
using System; public class Hello1 { public static int Main() { Console.WriteLine("Hello, World!"); return 0; } }
- Как распечатать UTF-8 из консольного приложения c ++ в Windows
- Как мне разрешить ввод номера в мое консольное приложение C #?
- Owin Self host & ASP .Net MVC
- Как получать уведомления устройства Plug & Play без формы windows
- Что происходит, когда вы закрываете консольное приложение c ++
- Установка позиции курсора в консольном приложении Win32
- Как остановить автоматическое закрытие приложений C #?
- Невозможно указать модификатор «async» в методе «Основной» консольного приложения
- Консольное приложение .NET как служба Windows
- Как запустить консольное приложение C # с консолью, скрытой
- Как программно отключить режим быстрого редактирования C # консольного приложения?
- Какова команда выхода из приложения Console на C #?
- Слушайте нажатие клавиши в приложении консоли .NET.
проблема здесь в том, что их программа Hello World появляется, и она сразу же закрывается.
почему это?
Потому что он закончен. Когда консольные приложения завершили выполнение и возвращаются из main
метода, соответствующее окно консоли автоматически закрывается. Это ожидаемое поведение.
Если вы хотите сохранить его открытым для целей отладки, вам нужно указать компьютеру ждать нажатия клавиши, прежде чем закрыть приложение и закрыть окно.
Метод Console.ReadLine
– это один из способов сделать это. Добавление этой строки в конец вашего кода (непосредственно перед оператором return
) заставит приложение ждать, пока вы не нажмете клавишу.
В качестве альтернативы, вы можете запустить приложение без отладчика, подключенного нажатием Ctrl + F5 из среды Visual Studio, но это имеет очевидный недостаток, препятствующий использованию функций отладки, которые вы, вероятно, захотите в своем распоряжении при написании приложения.
Лучшим компромиссом, вероятно, является вызов метода Console.ReadLine
только при отладке приложения путем его переноса в директиву препроцессора. Что-то вроде:
#if DEBUG Console.WriteLine("Press enter to close..."); Console.ReadLine(); #endif
Возможно, вы также захотите, чтобы окно оставалось открытым, если было выбрано неперехваченное исключение. Для этого вы можете поместить Console.ReadLine();
в блоке finally
:
#if DEBUG try { //... } finally { Console.WriteLine("Press enter to close..."); Console.ReadLine(); } #endif
Вместо того, чтобы использовать
Console.Readline() Console.Read() Console.ReadKey()
вы можете запустить свою программу с помощью Ctrl + F5 (если вы находитесь в Visual Studio). Затем Visual Studio откроет окно консоли, пока вы не нажмете клавишу.
Примечание. Вы не можете отлаживать свой код при таком подходе.
Это ведет себя так же, как для Ctrl F5 или F5 . Место сразу перед окончанием метода Main
.
using System.Diagnostics; private static void Main(string[] args) { DoWork(); if (Debugger.IsAttached) { Console.WriteLine("Press any key to continue . . ."); Console.ReadLine(); } }
Программа немедленно закрывается, потому что нет ничего, что могло бы остановить ее закрытие. Вставить точку останова при return 0;
или добавьте Console.Read();
перед return 0;
чтобы программа не закрывалась.
Я предполагаю, что причина, по которой вы не хотите, чтобы он закрывался в режиме отладки, заключается в том, что вы хотите посмотреть на значения переменных и т. Д. Поэтому лучше всего просто вставить точку останова при закрытии «}» основной функции , Если вам не нужно отлаживать, лучше выбрать вариант Ctrl-F5.
Кроме того, вы можете отсрочить закрытие, используя следующий код:
System.Threading.Thread.Sleep(1000);
Обратите внимание, что « Sleep
использует миллисекунды.
Другой способ – использовать Debugger.Break()
перед возвратом из метода Main
Код закончен, чтобы продолжить, вы должны добавить это:
Console.ReadLine();
или
Console.Read();
Используйте Console.Read (); чтобы программа не закрывалась, но убедитесь, что вы добавили Console.Read();
кода перед возвратом, иначе это будет недостижимый код.
Console.Read(); return 0;
проверьте эту консоль.
Добавьте метод Read
чтобы показать результат.
Console.WriteLine("Hello, World!"); Console.Read(); return 0;
Программа закрывается, как только выполняется выполнение. В этом случае, когда вы return 0;
, Это ожидаемая функциональность. Если вы хотите увидеть результат, либо запустите его в терминале вручную, либо установите время ожидания в конце программы, чтобы он оставался открытым на несколько секунд (с использованием библиотеки streamов).
Если вы хотите, чтобы приложение было открыто, вы не можете ничего делать, чтобы поддерживать работоспособность, поэтому посмотрите на код ниже:
while (true);
Это самый простой способ добиться ожидаемого поведения, но он теряет процессор, который так вынужден бесконечно итерировать.
На этом этапе вы можете использовать System.Windows.Forms.Application
(но для этого требуется добавить ссылку System.Windows.Forms
):
Application.Run();
Это не утечка процессора и работает успешно.
Чтобы не добавлять ссылку System.Windows.Forms
вы можете использовать простой трюк, импортируя System.Threading
:
SpinWait.SpinUntil(() => false);
Это также отлично работает, и он мысленно состоит в то while
iterator с отрицательным условием возвращается этим выше lambda-методом. Но это не утечка процессора! Зачем? Здесь вы можете посмотреть исходный код, но в основном спина ждет текущий stream.
Вы также можете выбрать создание петлителя сообщений, который просматривает ожидающие сообщения и обрабатывает каждый из них, прежде чем перейти к следующей итерации:
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "PeekMessage")] public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "GetMessage")] public static extern int GetMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "TranslateMessage")] public static extern int TranslateMessage(ref NativeMessage lpMsg); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport("user32.dll", EntryPoint = "DispatchMessage")] public static extern int DispatchMessage(ref NativeMessage lpMsg); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode] public static bool ProcessMessageOnce() { NativeMessage message = new NativeMessage(); if (!IsMessagePending(out message)) return true; if (GetMessage(out message, IntPtr.Zero, 0, 0) == -1) return true; Message frameworkMessage = new Message() { HWnd = message.handle, LParam = message.lParam, WParam = message.wParam, Msg = (int)message.msg }; if (Application.FilterMessage(ref frameworkMessage)) return true; TranslateMessage(ref message); DispatchMessage(ref message); return false; }
Затем вы можете безопасно перемещаться, выполняя что-то вроде этого:
while (true) ProcessMessageOnce();
Вы также можете сделать это лучше, заменив iterator while
с помощью вызова SpinWait.SpinUntil
:
SpinWait.SpinUntil(ProcessMessageOnce);
Добавьте следующее до возврата 0:
system("PAUSE");
Это печатает строку, чтобы нажать клавишу, чтобы закрыть окно. Он будет держать окно вверх, пока вы не нажмете клавишу ввода. У меня есть мои ученики, которые добавляют его во все свои программы.
если ваша программа требует, чтобы вы нажимали клавишу ввода, чтобы продолжить, как вы должны ввести значение и продолжить, а затем добавить новый двойной или int и тип записи до retunr (0); scanf_s (“% lf” и переменная);
Я всегда добавляю следующий оператор в консольное приложение. (Создайте fragment кода для этого, если хотите)
Console.WriteLine("Press any key to quit!"); Console.ReadKey();
Это помогает, когда вы хотите экспериментировать с другими концепциями через консольное приложение.
Ctr + F5 заставит консоль оставаться, но вы не можете отлаживать! Все консольные приложения, которые я написал в реальном мире, всегда не интерактивны и запускаются Планировщиком, таким как TWS или CA Work station, и не требуют чего-то подобного.
Чтобы упростить то, что говорят другие: Используйте Console.ReadKey();
,
Это делает его так, что программа ждет от пользователя нажатия обычной клавиши на клавиатуре
Источник: я использую его в своих программах для консольных приложений.
Вы можете решить его очень просто, просто используя ввод. Однако, если вы нажмете Enter
консоль снова исчезнет. Просто используйте Console.ReadLine();
или Console.Read();
В соответствии с моей озабоченностью, если мы хотим стабилизировать ВЫХОДУ КОНСОЛЬНОГО ПРИМЕНЕНИЯ, до закрытия выходного дисплея USE, метка: после метки MainMethod и goto; до окончания программы
В программе.
например:
static void Main(string[] args) { label: ---------- *****snippet of code***** ----------- **goto label;** }