Почему закрытие windows консоли сразу после отображения моего вывода?

Я изучаю C #, следуя инструкциям в MSDN .

Теперь я просто попробовал пример 1 ( вот ссылка на MSDN ), и я столкнулся с проблемой: почему закрытие windows консоли сразу после отображения моего вывода?

using System; public class Hello1 { public static int Main() { Console.WriteLine("Hello, World!"); return 0; } } 

проблема здесь в том, что их программа 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;** } 
  • Как написать быстрый цветной вывод на консоль?
  • Не удалось загрузить файл или сборку ... Была сделана попытка загрузить программу с неправильным форматом (System.BadImageFormatException)
  • как запустить winform из консольного приложения?
  • .NET Console TextWriter, который понимает Отступ / Неподвижный / IndentLevel
  • Как исправить «Нет перегрузки для метода» принимает 0 аргументов »?
  • Как открыть окно консоли
  • Запустить консольное приложение из другого консольного приложения
  • Как запустить консольное приложение .NET в фоновом режиме
  • Отключение ввода в консоли C # до завершения определенной задачи
  • Как запустить консольное приложение из Windows Service?
  • Interesting Posts

    PatternSyntaxException: незаконное повторение при использовании regex в Java

    UTF-8 в Spring MVC, проблема с формами FORM

    Есть ли эффективный способ копирования текста из PDF без разрывов строк?

    Решение «Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения» InvalidOperationException

    Как получить доступ к сохраненным учетным данным (PasswordVault?) На Win7 и Win8?

    Что такое механизм стека в микроархитектуре Sandybridge?

    Как определить, отображается ли программная клавиатура на устройстве Android?

    Неинтерактивный ssh ​​sudo … запрашивает пароль в виде простого текста

    Существует ли в нем плагин Eclipse для одновременного отображения двух копий кода?

    Pivot в SQLite

    AngularJS для цикла с числами и диапазонами

    Папка «Мои документы» для нового местоположения в Windows 7

    В Firefox я случайно нажал «Начать новую сессию» после сбоя. Как я могу вернуть все свои вкладки?

    Как я могу выполнить модуль node.js в качестве дочернего процесса в программе node.js?

    Очень высокий шум, когда компьютер делает что-то интенсивное?

    Давайте будем гением компьютера.