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

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

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

using System;

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

18 ответов


проблема здесь в том, что их программа Hello World появляется, тогда она сразу же закроется.
почему так?

потому что это закончилось. когда консольные приложения завершат выполнение и вернутся из своих main метод, связанное окно консоли автоматически закрывается. Это ожидаемое поведение.

если вы хотите сохранить его открытым для целей отладки, вам нужно будет проинструктировать компьютер ждать нажмите клавишу, прежде чем закончить приложение и закрыть окно.

на Console.ReadLine метод это один из способов сделать это. Добавление этой строки в конец кода (непосредственно перед return заявление) заставит приложение ждать, пока вы нажмете клавишу перед выходом.

кроме того, вы можете запустить приложение без прикрепленного отладчика, нажав Ctrl+Ф5 из среды 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+Ф5 (если вы находитесь в Visual Studio). Затем Visual Studio будет держать окно консоли открытым, пока вы не нажмете клавишу.

Примечание: Вы не можете отлаживать свой код в этот подход.


это ведет себя одинаково для CtrlФ5 или Ф5. Место непосредственно перед концом 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 method


код завершен, для продолжения вам нужно добавить следующее:

Console.ReadLine();

или

Console.Read();

Консоль Использовать.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. Мои ученики добавляют его во все свои программы.


Если ваша программа требует, чтобы вы нажали enter, чтобы продолжить, как вы должны ввести значение и продолжить, затем добавьте новый double или int и введите write перед retunr(0); scanf_s ("%lf",&переменная);


Я всегда добавляю следующий оператор в консольное приложение.(Создайте фрагмент кода для этого, если хотите)

Console.WriteLine("Press any key to quit!");
Console.ReadKey();

Это помогает, когда вы хотите экспериментировать с различными концепциями через консольное приложение.

СTR + F5 И сделает консоль остаться, но вы не можете отладить! Все консольные приложения, которые я написал в realworld, всегда не интерактивны и запускаются планировщиком, таким как TWS или рабочая станция CA, и не требуют что-то вроде этого.


чтобы упростить то, что другие говорят: Использовать Console.ReadKey();.

это делает его так, что программа ждет от пользователя, чтобы нажать обычную клавишу на клавиатуре

Source: я использую его в своих программах для консольных приложений.


вы можете решить его очень простым способом, просто вызывая вход. Однако, если вы нажмете Enter затем консоль снова отключится. Просто используйте это Console.ReadLine(); или Console.Read();


согласно моей заботе, если мы хотим стабилизированный выход консольного приложения, то до конца пользы дисплея выхода, ярлык: после MainMethod, и ярлыка goto; перед концом программы

в программе.

например:

static void Main(string[] args)
{

    label:
    ----------
    *****snippet of code*****
    -----------

    **goto label;**

}