Schleife beende bevor das Programm schließt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Schleife beende bevor das Programm schließt

    Hallo,

    Wollte mal fragen ob es machbar ist wenn ich eine consolenApp programmiere das wenn ich das programm schließe egal ob mit dem X im Fenster oder anders weitig das die schleife erst bis zum Ende läuft und sich das Programm dann schließt
    Aber der Link führt doch in das Gegenteil.
    Wunsch: X drücken, Programmende soll warten, bis Programm fertig berechnet hat
    Link: X drücken, Programmende soll NICHT warten, bis Programm fertig berechnet hat, sondern sofort schließen.
    Auf stackoverflow ist zumindest ne Variante, wie man das [X] beseitigt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also der 2te Post führt dann hier hin: stackoverflow.com/questions/47…ture-console-exit-c-sharp

    VB.NET-Quellcode

    1. <DllImport("Kernel32")>
    2. Private Shared Function SetConsoleCtrlHandler(ByVal handler As EventHandler, ByVal add As Boolean) As Boolean
    3. Private Delegate Function EventHandler(ByVal sig As CtrlType) As Boolean
    4. Shared _handler As EventHandler
    5. Enum CtrlType
    6. CTRL_C_EVENT = 0
    7. CTRL_BREAK_EVENT = 1
    8. CTRL_CLOSE_EVENT = 2
    9. CTRL_LOGOFF_EVENT = 5
    10. CTRL_SHUTDOWN_EVENT = 6
    11. End Enum
    12. Private Shared Function Handler(ByVal sig As CtrlType) As Boolean
    13. Select Case sig
    14. Case Else
    15. Return False
    16. End Select
    17. End Function
    18. Private Shared Sub Main(ByVal args As String())
    19. AddHandler _handler, New EventHandler(AddressOf Handler)
    20. SetConsoleCtrlHandler(_handler, True)
    21. End Sub

    Um mal reinzugrätschen:
    Wäre eine Migration nach WinForms nicht eine Option?
    User-Interaktion in einer Konsole-Anwendung entwickelt sich sehr leicht zu einem undurchdringlichen Dschungel von Workarounds.
    Und im Ergebnis die User-Experience bleibt dennoch meilenweit hinter der einer ganz banalen Winforms-Anwendung zurück.

    Mit anderen Worten: Konsole ist kein geeignetes Instrument, um User-Interaktion umzusetzen.

    C#-Quellcode

    1. ​using System.Runtime.InteropServices;
    2. HookConsole.Init();
    3. for(int i = 0; i < int.MaxValue; i++)
    4. {
    5. Console.WriteLine(i);
    6. }
    7. static bool OnWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
    8. {
    9. Console.WriteLine(msg);
    10. return true; // default and needed
    11. }
    12. class HookConsole
    13. {
    14. public static void Init()
    15. {
    16. SetConsoleCtrlHandler(ConsoleCtrlHandle, true);
    17. }
    18. private static bool ConsoleCtrlHandle(ConsoleCtrlHandlerCode eventCode)
    19. {
    20. switch (eventCode)
    21. {
    22. case ConsoleCtrlHandlerCode.CTRL_CLOSE_EVENT:
    23. case ConsoleCtrlHandlerCode.CTRL_BREAK_EVENT:
    24. case ConsoleCtrlHandlerCode.CTRL_LOGOFF_EVENT:
    25. case ConsoleCtrlHandlerCode.CTRL_SHUTDOWN_EVENT:
    26. {
    27. // not good but helps :D
    28. while(true) {
    29. Thread.Sleep(10);
    30. }
    31. }
    32. }
    33. return false;
    34. }
    35. enum ConsoleCtrlHandlerCode : uint
    36. {
    37. CTRL_C_EVENT = 0,
    38. CTRL_BREAK_EVENT = 1,
    39. CTRL_CLOSE_EVENT = 2,
    40. CTRL_LOGOFF_EVENT = 5,
    41. CTRL_SHUTDOWN_EVENT = 6
    42. }
    43. [DllImport("kernel32.dll")]
    44. static extern bool SetConsoleCtrlHandler(ConsoleCtrlHandlerDelegate handlerProc, bool add);
    45. delegate bool ConsoleCtrlHandlerDelegate(ConsoleCtrlHandlerCode eventCode);
    46. }
    @ErfinderDesRades Genau.
    @lunifrw1 Eine Consolen-Anwendung hat die Eigenschaft, sich beim [X]-Klick zu beenden PUNKT.
    Bei einer WinForm kannst Du ganz easy verhindern, dass sie vorzeitig endet.
    Alles über Events
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    sehr gut das du zitiern kannst :D, zudem ich diesen Beitrag maximal unnötig find,
    denn er trägt 0 zum Problem bei!

    btw. es geht hier immer noch um eine Consolen-Anwendung.
    zudem kommt, das zwei personen, (Schleife beende bevor das Programm schließt und
    Schleife beende bevor das Programm schließt) eine lösung gepostet haben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Facebamm schrieb:

    denn er trägt 0 zum Problem bei!
    Korrekt.
    Möglicherweise eröffnet er aber neue Lösungsmöglichkeiten. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!