Почему окно консоли закрывается сразу же после отображения моего вывода?
Я изучаю C#, следуя руководствам в MSDN.
теперь я просто попробовал Пример 1 (здесь это ссылка MSDN), и я столкнулся с проблемой:почему окно консоли закрывается сразу же после отображения моего вывода?
using System;
public class Hello1
{
public static int Main()
{
Console.WriteLine("Hello, World!");
return 0;
}
}
18 ответов:
проблема здесь в том, что их программа Hello World появляется, тогда она сразу же закроется.
почему?потому что это закончилось. когда консольные приложения завершат выполнение и вернутся из своих
mainметод, соответствующее окно консоли автоматически закрывается. Это ожидаемое поведение.если вы хотите сохранить его открытым для отладки, вам нужно будет проинструктировать компьютер ждать нажатие клавиши перед завершением работы приложения и закрытием окна.
The
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 будет держать окно консоли открытым, пока вы не нажмете клавишу.
Примечание: Вы не можете отлаживать свой код в этот подход.
этот ведет себя так же для CtrlF5 или 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использует миллисекунд.
Консоль Использовать.Read (); чтобы предотвратить закрытие программы, но убедитесь, что вы добавили
Console.Read();код перед оператором return, иначе это будет недостижимый код .Console.Read(); return 0;проверить это
Добавить
Readметод для отображения выходных данных.Console.WriteLine("Hello, World!"); Console.Read(); return 0;
программа закрывается, как только операция будет завершена. В этом случае, когда вы
return 0;. Это ожидаемая функциональность. Если вы хотите увидеть вывод, то либо запустите его в терминале вручную, либо установите ожидание в конце программы, чтобы он оставался открытым в течение нескольких секунд ( используя библиотеку потоков ).
если вы хотите, чтобы приложение было открыто, вы не можете делать ничего, что поддерживает процесс, поэтому посмотрите на код ниже:
while (true);это самый простой способ добиться ожидаемого поведения, но он протекает CPU, который так вынужден итерировать бесконечно.
на данный момент Вы можете выбрать, чтобы использовать
System.Windows.Forms.Application(но это требует, чтобы добавитьSystem.Windows.Formsссылка):Application.Run();это не утечка процессора и работает успешно.
не добавлять
System.Windows.Formsссылка вы можете использовать простой трюк, импортирующихSystem.Threading:SpinWait.SpinUntil(() => false);это тоже прекрасно работает, и он мысленно состоит в
whileитератор с отрицательным условием, которое возвращается указанным выше лямбда-методом. Но это не утечка процессора! Зачем? Вы можете посмотреть на исходный код здесь, но это в основном спина ждет текущий поток.вы также можете выбрать для создания петлителя сообщений, который просматривает ожидающие сообщения и обрабатывает каждое из них перед переходом к следующей итерации:
[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();вы также можете сделать это лучше, заменив
whileитератор сSpinWait.SpinUntilссылка:SpinWait.SpinUntil(ProcessMessageOnce);
перед возвращением 0 добавьте следующее:
system("PAUSE");это печатает строку, чтобы нажать клавишу, чтобы закрыть окно. Он будет держать окно до тех пор, пока вы не нажмете клавишу ввода. У меня есть мои студенты добавить его во все свои программы.
Если ваша программа требует, чтобы вы нажали enter, чтобы продолжить, как вы должны ввести значение и продолжить, затем добавьте новый double или int и введите write перед retunr(0); scanf_s ("%lf", & переменная);
Я всегда добавляю следующий оператор в консольное приложение.(Создайте фрагмент кода для этого, если хотите)
Console.WriteLine("Press any key to quit!"); Console.ReadKey();Это помогает, когда вы хотите экспериментировать с различными концепциями через консольное приложение.
Ctr + F5 сделает консоль остаться, но вы не можете отлаживать! Все консольные приложения, которые я написал в realworld, всегда неинтерактивны и запускаются планировщиком, таким как TWS или CA Work station, и не требуют что-то вроде этого.
чтобы упростить то, что другие говорят: Используйте
Console.ReadKey();.это делает его так, что программа ждет от пользователя, чтобы нажать обычную клавишу на клавиатуре
Источник: я использую его в своих программах для консольных приложений.
вы можете решить это очень простым способом, просто вызывая вход. Однако, если вы нажмете
Enterзатем консоль снова отключится. Просто используйте этоConsole.ReadLine();илиConsole.Read();
согласно моей озабоченности, если мы хотим стабилизировать вывод консольного приложения, до конца использования выходного дисплея, метка: после MainMethod и метки goto; до конца программы
в программе.
например:
static void Main(string[] args) { label: ---------- *****snippet of code***** ----------- **goto label;** }
Comments