Warum schließt das Konsolenfenster sofort einmal meine Ausgabe?

Ich studiere C #, indem ich den Handbüchern in MSDN folge .

Jetzt habe ich nur Beispiel 1 versucht ( hier ist der Link zu MSDN ), und ich habe ein Problem festgestellt: Warum schließt das Konsolenfenster sofort einmal meine Ausgabe?

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

   

Das Problem hier ist, dass ihr Hello World Program angezeigt wird, dann würde es sofort schließen.
Warum das?

Weil es fertig ist. Wenn Konsolenanwendungen die Ausführung und Rückkehr von ihrer Hauptmethode abgeschlossen haben, wird das zugehörige Konsolenfenster automatisch geschlossen. Dies ist das erwartete Verhalten.

Wenn Sie es für Debugging-Zwecke geöffnet lassen möchten, müssen Sie den Computer anweisen, auf einen Tastendruck zu warten, bevor Sie die App beenden und das Fenster schließen.

Die Console.ReadLine Methode ist eine Möglichkeit, dies zu tun. Wenn Sie diese Zeile am Ende Ihres Codes (kurz vor der return statement) hinzufügen, wartet die Anwendung darauf, dass Sie vor dem Beenden eine Taste drücken.

Alternativ können Sie die Anwendung ohne den angehängten Debugger starten, indem Sie in der Visual Studio-Umgebung Strg + F5 drücken. Dies hat jedoch den offensichtlichen Nachteil, dass Sie die Debugging-functionen nicht verwenden können, die Sie beim Schreiben einer Anwendung wahrscheinlich benötigen.

Der beste Kompromiss besteht wahrscheinlich darin, die Console.ReadLine Methode nur beim Debuggen der Anwendung durch Einschließen in eine Präprozessordirektive aufzurufen. Etwas wie:

 #if DEBUG Console.WriteLine("Press enter to close..."); Console.ReadLine(); #endif 

Möglicherweise möchten Sie auch, dass das Fenster geöffnet bleibt, wenn eine nicht abgefangene Ausnahme ausgetriggers wurde. Dazu können Sie die Console.ReadLine(); in einem Endblock:

 #if DEBUG try { //... } finally { Console.WriteLine("Press enter to close..."); Console.ReadLine(); } #endif 

Anstatt zu verwenden

 Console.Readline() Console.Read() Console.ReadKey() 

Sie können Ihr Programm mit Strg + F5 (wenn Sie in Visual Studio sind) ausführen. Dann hält Visual Studio das Konsolenfenster geöffnet, bis Sie eine Taste drücken.

Hinweis: Sie können Ihren Code bei diesem Ansatz nicht debuggen.

Dies gilt für Strg F5 oder F5 . Platzieren Sie sie unmittelbar vor Ende der Main Methode.

 using System.Diagnostics; private static void Main(string[] args) { DoWork(); if (Debugger.IsAttached) { Console.WriteLine("Press any key to continue . . ."); Console.ReadLine(); } } 

Das Programm wird sofort geschlossen, weil nichts daran hindert, es zu schließen. Fügen Sie einen Haltepunkt bei return 0; oder fügen Sie Console.Read(); vor der return 0; um zu verhindern, dass das Programm geschlossen wird.

Ich nehme an, der Grund, warum Sie nicht möchten, dass es im Debug-Modus geschlossen wird, ist, weil Sie die Werte von Variablen usw. betrachten wollen. Es ist daher wahrscheinlich am besten, nur einen Break-Point am abschließenden “}” der Hauptfunktion einzufügen . Wenn Sie nicht debuggen müssen, ist Ctrl-F5 die beste Option.

Alternativ können Sie das Schließen mit dem folgenden Code verzögern:

 System.Threading.Thread.Sleep(1000); 

Beachten Sie, dass der Sleep Millisekunden verwendet.

Eine andere Möglichkeit besteht darin, Debugger.Break() bevor Sie von der Main-Methode zurückkehren

Der Code ist fertig, um fortzufahren musst du folgendes hinzufügen:

 Console.ReadLine(); 

oder

 Console.Read(); 

Verwenden Sie Console.Read (); um zu verhindern, dass das Programm geschlossen wird, aber stellen Sie sicher, dass Sie die Console.Read(); Code vor return-statement, sonst wird es ein nicht erreichbarer Code sein.

  Console.Read(); return 0; 

Überprüfen Sie diese Konsole. Lesen

Fügen Sie die Read Methode hinzu, um die Ausgabe anzuzeigen.

 Console.WriteLine("Hello, World!"); Console.Read(); return 0; 

Das Programm wird beendet, sobald die Ausführung abgeschlossen ist. In diesem Fall, wenn Sie return 0; . Dies ist die erwartete functionalität. Wenn Sie die Ausgabe sehen wollen, dann führen Sie sie entweder manuell in einem Terminal aus oder setzen Sie eine Wartezeit am Ende des Programms, so dass sie für einige Sekunden geöffnet bleibt (mit der Threading-Bibliothek).

Wenn Sie die Anwendung geöffnet halten möchten, können Sie nichts tun, was den process am Leben erhält. Sehen Sie sich den folgenden Code an:

 while (true); 

Dies ist der einfachste Weg, um das erwartete Verhalten zu erreichen, aber es verliert CPU, die so gezwungen wird, unendlich zu iterieren.

An diesem Punkt können Sie die Verwendung von System.Windows.Forms.Application (es muss jedoch die System.Windows.Forms Referenz hinzugefügt werden):

 Application.Run(); 

Dies führt nicht zum Verlust der CPU und funktioniert erfolgreich.

Um das Hinzufügen der System.Windows.Forms Referenz zu vermeiden, können Sie einen einfachen Trick verwenden und System.Threading importieren:

 SpinWait.SpinUntil(() => false); 

Dies funktioniert auch perfekt, und es besteht mental aus einem Iterator mit einer negierten Bedingung, die durch die obige Lambda-Methode zurückgegeben wird. Aber es leckt CPU nicht! Warum? Sie können sich hier den Quellcode ansehen, aber im Grunde dreht Spin den aktuellen Thread.

Sie können auch einen Nachrichten-Looper erstellen, der die ausstehenden Nachrichten vor dem Übergeben an die nächste Iteration durchsucht und verarbeitet:

 [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; } 

Dann können Sie sicher eine Schleife machen, indem Sie so etwas tun:

 while (true) ProcessMessageOnce(); 

Sie können dies auch besser tun, indem Sie den while Iterator durch einen SpinWait.SpinUntil Aufruf SpinWait.SpinUntil :

 SpinWait.SpinUntil(ProcessMessageOnce); 

Fügen Sie vor der Rückgabe 0 Folgendes hinzu:

 system("PAUSE"); 

Dies druckt eine Linie, um eine Taste zu drücken, um das Fenster zu schließen. Es hält das Fenster hoch, bis Sie die Eingabetaste drücken. Ich lasse meine Schüler es allen ihren Programmen hinzufügen.

Wenn Ihr Programm erfordert, dass Sie die Eingabetaste drücken, um fortzufahren, als müssten Sie einen Wert eingeben und fortfahren, dann fügen Sie ein neues double oder int hinzu und schreiben write before retunr (0); scanf_s (“% lf”, & die Variable);

Ich füge immer die folgende statement zu einer Konsolenanwendung hinzu. (Erstellen Sie ein Code-Snippet, wenn Sie möchten)

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

Dies hilft, wenn Sie verschiedene Konzepte über die Konsolenanwendung ausprobieren möchten.

Ctr + F5 wird die Konsole bleiben aber Sie können nicht debuggen! Alle Konsolenanwendungen, die ich in realworld geschrieben habe, sind immer nicht interaktiv und werden von einem Scheduler wie TWS oder CA Workstation ausgetriggers und erfordern nicht so etwas.

Um zu vereinfachen, was andere sagen: Verwenden Sie Console.ReadKey(); .

Dies macht es so, dass das Programm darauf wartet, dass der Benutzer eine normale Taste auf der Tastatur drückt

Quelle: Ich verwende es in meinen Programmen für Konsolenanwendungen.

Sie können es sehr einfach lösen, indem Sie nur die Eingabe aufrufen. Wenn Sie jedoch die Enter drücken, wird die Konsole wieder deaktiviert. Verwenden Sie einfach diese Console.ReadLine(); oder Console.Read();

Laut meiner Sorge, wenn wir die OUTPUT OF CONSOLE APPLICATION stabilisieren wollen, bis zum Ende der Ausgabe Anzeige USE, die Bezeichnung: nach der MainMethod, und goto Etikett; vor dem Ende des Programms

Im Programm.

z.B:

 static void Main(string[] args) { label: ---------- *****snippet of code***** ----------- **goto label;** }