Studiuję C #, postępując zgodnie z przewodnikami w MSDN .
Teraz właśnie wypróbowałem przykład 1 ( tutaj jest łącze do MSDN ) i napotkałem problem: dlaczego okno konsoli zamyka się natychmiast po wyświetleniu moich danych wyjściowych?
using System;
public class Hello1
{
public static int Main()
{
Console.WriteLine("Hello, World!");
return 0;
}
}
c#
.net
console-application
msdn
user962206
źródło
źródło
Odpowiedzi:
Ponieważ jest skończone. Gdy aplikacje konsolowe zakończą wykonywanie i powrócą ze swojej
main
metody, skojarzone okno konsoli zostanie automatycznie zamknięte. Jest to oczekiwane zachowanie.Jeśli chcesz, aby była otwarta do celów debugowania, musisz poinstruować komputer, aby czekał na naciśnięcie klawisza przed zamknięciem aplikacji i zamknięciem okna.
Console.ReadLine
Metoda jest jednym ze sposobów na osiągnięcie tego. Dodanie tego wiersza na końcu kodu (tuż przedreturn
instrukcją) spowoduje, że aplikacja zaczeka na naciśnięcie klawisza przed wyjściem.Alternatywnie możesz uruchomić aplikację bez dołączonego debugera, naciskając Ctrl+ F5z poziomu środowiska Visual Studio, ale ma to oczywistą wadę, ponieważ uniemożliwia korzystanie z funkcji debugowania, które prawdopodobnie chcesz mieć do dyspozycji podczas pisania aplikacji.
Najlepszym kompromisem jest prawdopodobnie wywoływanie
Console.ReadLine
metody tylko podczas debugowania aplikacji poprzez umieszczenie jej w dyrektywie preprocesora. Coś jak:Możesz także chcieć, aby okno pozostało otwarte, jeśli został zgłoszony nieprzechwycony wyjątek. Aby to zrobić, możesz umieścić
Console.ReadLine();
wfinally
bloku:źródło
if (System.Diagnostics.Debugger.IsAttached) Console.ReadLine();
.Zamiast używać
możesz uruchomić swój program za pomocą Ctrl+ F5(jeśli jesteś w Visual Studio). Następnie program Visual Studio pozostawi otwarte okno konsoli do momentu naciśnięcia klawisza.
Uwaga: w ten sposób nie można debugować kodu.
źródło
Ctrl + F5
inaczej, a co po prostu całkiemStart
inaczej?Zakładam, że powodem, dla którego nie chcesz, aby zamykał się w trybie debugowania, jest to, że chcesz spojrzeć na wartości zmiennych itp. Więc prawdopodobnie najlepiej jest po prostu wstawić punkt przerwania na zamykającym "}" funkcji głównej . Jeśli nie musisz debugować, najlepszym rozwiązaniem jest Ctrl-F5.
źródło
Zachowuje się to tak samo w przypadku CtrlF5lub F5. Miejsce bezpośrednio przed zakończeniem
Main
metody.źródło
Console.ReadKey()
dla dowolnego klawisza,Console.ReadLine()
czeka na naciśnięcie klawisza EnterProgram zamyka się natychmiast, ponieważ nic go nie powstrzymuje. Wstaw punkt przerwania na
return 0;
lub dodajConsole.Read();
przed,return 0;
aby zapobiec zamknięciu programu.źródło
Trochę się spóźniłem na imprezę, ale: w Visual Studio 2019 dla projektów .NET Core konsola domyślnie nie zamyka się automatycznie. Możesz skonfigurować zachowanie za pomocą menu Narzędzia → Opcje → Debugowanie → Ogólne → Automatycznie zamknij konsolę po zatrzymaniu debugowania. Jeśli okno konsoli zostanie automatycznie zamknięte, sprawdź, czy wspomniane ustawienie nie jest ustawione.
To samo dotyczy projektów konsoli nowego stylu .NET Framework:
Projekt .NET Framework w starym stylu nadal bezwarunkowo zamyka konsolę na końcu (od Visual Studio 16.0.1).
Źródła: https://devblogs.microsoft.com/dotnet/net-core-tooling-update-for-visual-studio-2019-preview-2/
źródło
Jeśli chcesz, aby Twoja aplikacja pozostała otwarta, musisz coś zrobić, aby utrzymać jej proces. Poniższy przykład jest najprostszym przykładem, który należy umieścić na końcu programu:
Jednak spowoduje to przeciążenie procesora, ponieważ w związku z tym jest zmuszony do nieskończonej iteracji.
W tym momencie możesz zdecydować się na użycie
System.Windows.Forms.Application
klasy (ale wymaga to dodaniaSystem.Windows.Forms
referencji):To nie powoduje wycieku procesora i działa pomyślnie.
Aby uniknąć dodawania
System.Windows.Forms
referencji, możesz skorzystać z prostego triku, tzw. Czekania spinowego , importującegoSystem.Threading
:Działa to również doskonale i zasadniczo składa się z
while
pętli z zanegowanym warunkiem, który jest zwracany przez powyższą metodę lambda. Dlaczego to nie przeciąża procesora? Możesz spojrzeć na kod źródłowy tutaj ; w każdym razie po prostu czeka jakiś cykl procesora przed iteracją.Możesz także utworzyć pętlę komunikatów, która przegląda oczekujące wiadomości z systemu i przetwarza każdą z nich przed przejściem do następnej iteracji, w następujący sposób:
Następnie możesz bezpiecznie zapętlić, wykonując coś takiego:
źródło
Alternatywnie możesz opóźnić zamknięcie za pomocą następującego kodu:
Zwróć uwagę, że
Sleep
używa milisekund.źródło
Innym sposobem jest użycie
Debugger.Break()
przed powrotem z metody Mainźródło
Kod jest gotowy, aby kontynuować, musisz dodać to:
lub
źródło
Użyj Console.Read (); aby zapobiec zamknięciu programu, ale upewnij się, że dodałeś
Console.Read();
kod przed instrukcją return, w przeciwnym razie będzie to kod nieosiągalny.sprawdź ten Console.Read
źródło
Add
Read
Metoda wyświetlania danych wyjściowych.źródło
Oto sposób na zrobienie tego bez angażowania się
Console
:źródło
Program jest zamykany natychmiast po zakończeniu wykonywania. W tym przypadku, gdy ty
return 0;
. Jest to oczekiwana funkcjonalność. Jeśli chcesz zobaczyć dane wyjściowe, uruchom je ręcznie w terminalu lub ustaw czekanie na końcu programu, aby pozostał otwarty przez kilka sekund (używając biblioteki wątków).źródło
to jest odpowiedź asynchroniczna w aplikacji konsoli w C #?
wszystko, gdziekolwiek w aplikacji konsoli, nigdy nie używa,
await
ale zamiast tego używatheAsyncMethod().GetAwaiter().GetResult();
,przykład
var result = await HttpClientInstance.SendAsync(message);
staje się
var result = HttpClientInstance.SendAsync(message).GetAwaiter().GetResult();
źródło
jeśli twój program wymaga naciśnięcia klawisza enter, aby kontynuować, tak jak musisz wprowadzić wartość i kontynuować, dodaj nowe podwójne lub int i wpisz write przed retunr (0); scanf_s ("% lf", & zmienna);
źródło
Zawsze dodaję następującą instrukcję do aplikacji konsoli. (Jeśli chcesz, utwórz dla tego fragment kodu)
Takie postępowanie pomaga, gdy chcesz eksperymentować z różnymi koncepcjami za pomocą aplikacji konsolowej.
Ctr + F5 sprawi, że konsola pozostanie, ale nie możesz debugować! Wszystkie aplikacje konsolowe, które napisałem w realworld, są zawsze nieinteraktywne i uruchamiane przez harmonogram, taki jak stacja robocza TWS lub CA, i nie wymagały czegoś takiego.
źródło
Aby uprościć to, co mówią inni: Użyj
Console.ReadKey();
.To sprawia, że program czeka, aż użytkownik naciśnie normalny klawisz na klawiaturze
Źródło: używam go w moich programach dla aplikacji konsolowych.
źródło
Możesz rozwiązać ten problem w bardzo prosty sposób, po prostu wywołując dane wejściowe. Jeśli jednak naciśniesz,
Enter
konsola ponownie zniknie. Po prostu użyj tegoConsole.ReadLine();
lubConsole.Read();
źródło
Dodaj co następuje przed zwrotem 0:
Spowoduje to wyświetlenie linii, w której należy nacisnąć klawisz, aby zamknąć okno. Utrzyma okno aż do naciśnięcia klawisza Enter. Mam moich uczniów, którzy dodają go do wszystkich swoich programów.
źródło
Zgodnie z moimi obawami, jeśli chcemy ustabilizować WYJŚCIE APLIKACJI KONSOLI, aż do zamknięcia wyjścia wyświetli się napis USE, etykieta: po MainMethod i etykieta goto; przed zakończeniem programu
W programie.
na przykład:
źródło
goto
zeznanie jest dozwolone nawet w C #.