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



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



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



using System;

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

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 использует миллисекунд.

другой способ-использовать Debugger.Break() перед возвращением из основного метода

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

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, чтобы продолжить, как вы должны ввести значение и продолжить, затем добавьте новый 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

    Ничего не найдено.