2016-08-02 12 views
1

Beim Aufruf Close() Methode wird das Formular nicht sofort geschlossen. Es muss warten, bis anderer Code (z. B. alle laufenden Methoden) abgeschlossen ist. Hinweis: dieses Verhalten tritt bei dem Hauptformular nicht auf.Schließen Sie das Formular sofort in WinForms-Anwendung

Was will ich erreichen:

Private Sub Dummy() 
    If foo() Then Close() 
    If bar() Then Close() 

    'Other code that shouldn't be reached 
    'if 'foo()' or 'bar()' returned true. 
End Sub 
  • ich will nicht tun, für beide Werte nennen foo() und bar(), zu überprüfen, und dann Close() zu nennen.

  • Ich weiß, dass ich so etwas tun kann:

    If foo() Then 
        Close() 
        Exit Sub ' Or (Return) 
    End If 
    

Aber ich bin auf der Suche nach etwas einfacher und -preferably- wird das Formular sofort ohne Rückkehr an den Anrufer Methode , wenn es in der Nähe alle.

  • Gibt es eine Möglichkeit, dies zu erreichen?
  • Ist es nicht der richtige Ansatz?
+0

Wenn wir Methode 'A()' die Methode 'B nennt()', und nennen wollen 'Close()' 'von Verfahren B()'. In diesem Fall wird der Code in der Methode 'A()' weiterhin ausgeführt. Ich hoffe es ist jetzt klar. –

Antwort

0

Ich denke, die Close() und Exit Sub Ansatz ist so einfach wie man sich wünschen kann, wirklich :)

Close() wird das aktuelle Verfahren in VB.Net WinForms nicht beenden, von Entwurf. Ich denke also, dass der von Ihnen erwähnte Ansatz der sauberste Weg ist. Close() Verhalten ist ein wenig seltsam, aber es ermöglicht Szenarien, in denen Cleanup-Code weiter ausgeführt werden kann, aber mit dem Wissen, das Formular wird geschlossen, wenn das Unterprogramm beendet ist.

+0

Nun, dieser Ansatz könnte einfach sein, aber wenn es einige Methoden zum Aufruf gibt, wird es auch nicht für sie funktionieren. –

+0

Caller-Methoden werden auch den gesamten Stack-Baum beenden. – Lunster

+0

Danke nochmal, aber nein. 'Exit Sub' oder' Return' beendet nur die aktuelle Prozedur und setzt die Ausführung der aufrufenden ein. Sie können es selbst ausprobieren. –

1

schließt das Formular sofort ohne zurück zur Aufrufer-Methode, wenn es welche gibt.

Es gibt IMMER einen Anrufer Methode, auch wenn das Verfahren nur die Schleife/Meldungsverteilschleife Windows-Ereignis ist. Wenn es keine Aufrufmethode gibt, wird das Programm beendet. Das ist, wie stack-basierte Programmierumgebungen, die so ziemlich alle modernen Computersysteme definieren, funktionieren: Methoden werden auf den Call-Stack geschoben, wenn sie aufgerufen werden, und wenn nichts mehr auf dem Stack ist, ist das Programm fertig.

Sogar innerhalb Ihres Codes für Ihr Programm oder Formular ist das, was Sie fordern, das Umgehen des Aufrufers auf dem Stapel, was äquivalent (oder schlechter) zu GOTO ist, da es die grundlegenden Regeln von strukturierte Programmierung. Wenn Sie wirklich möchten, dass das Programm beendet wird, können Sie Environment.Exit() versuchen. Ansonsten ist Exit Sub oder Return Ihre beste Option.

+0

+1 Danke für die Klärung. Ich möchte das Programm nicht beenden. Ich möchte nur das aktuelle Formular schließen und zum vorherigen zurückkehren. (Mit 'Aufrufmethode 'meine ich irgendeine Aufrufmethode in der aktuellen Form). –

+0

Ein Absatz hinzugefügt, um die Dinge noch klarer zu machen. –

+0

Ich sehe. Es gibt also keine Möglichkeit, alle Methoden des aktuellen Formulars aus dem Stapel zu löschen und das Formular sofort zu schließen. (Ich meine etwas wie 'Application.Exit()' aber nicht auf die gesamte Anwendung erweitert) –

1

Wie die anderen gesagt haben, gibt es kein einfacheres Muster als das, was Sie gepostet haben.

Wenn wir die Methode A() haben, die die Methode B() aufruft und die Methode Close() von Methode B() aufrufen soll. In diesem Fall wird der Code in der Methode A() weiterhin ausgeführt.

Wenn Sie MethodA verlassen wollen, wenn das Formular in MethodB geschlossen wurde, können Sie die IsDisposed Eigenschaft des Formulars überprüfen. Es wird True nach dem Aufruf Form.Close sein. Alternativ können Sie die Eigenschaft Form.Visble in MethodA überprüfen; Es wird False sein, wenn das Formular geschlossen wurde.

Etwas wie folgt aus:

Sub MethodA() 
    MethodB() 
    If Me.IsDisposed Then Exit Sub 
    ' some more code to run if Form is not closed 
End Sub 

Sub MethodB() 
    If foo() Then 
     Me.Close() 
     Exit Sub 
    End If 
    If bar() Then 
     Me.Close() 
     Exit Sub 
    End If 
End Sub 
+0

Danke, ich werde es versuchen –