2016-08-02 3 views
1

При вызове метода Close() вид не завершен немедленно. Он должен дождаться завершения другого кода (например, всех запущенных методов). Примечание: это не происходит в основной форме.Закрыть форму немедленно в приложении WinForms

То, что я хочу добиться:

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 
  • я НЕ хотите позвонить foo() и bar(), проверьте для обоих значений, а затем вызвать Close().

  • Я знаю, что я могу сделать что-то вроде:

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

Но я ищу что-нибудь попроще и -preferably- будет закрыть форму сразу, не возвращаясь к методу вызывающего , если есть любой.

  • Есть ли способ достичь этого?
  • Не правильный подход?
+0

Если у нас есть метод 'A()', который вызывает метод 'B()', и хотите позвонить 'Close()' от метода 'B()'. В этом случае код в методе 'A()' все равно будет выполнен. Надеюсь, теперь это ясно. –

ответ

0

Я думаю Close() и Exit Sub подход так просто, как вы могли бы надеяться на, на самом деле :)

Close() не прекращает текущую процедуру в VB.Net WinForms, дизайн. Поэтому я считаю, что подход Exit Sub, который вы упомянули, является самым чистым способом. Поведение Close() немного странно, но оно позволяет сценарии, в которых код очистки может продолжаться, но при условии, что форма закрывается при завершении подпрограммы.

+0

Ну, этот подход может быть простым, но если есть некоторые методы вызова, это также не сработает для них. –

+0

Методы вызова также закончатся, вплоть до дерева стека. – Lunster

+0

Еще раз спасибо, но нет. 'Exit Sub' или' Return' выйдут из текущей процедуры и продолжат работу с вызывающими. Вы можете попробовать сами. –

1

закроет форму немедленно , не возвращаясь к вызывающему методу, если таковой имеется.

Там в ВСЕГДА метод звонящего по телефону, даже если этот метод является только событие Windows, цикл/сообщение насоса. Если нет метода вызова, программа завершает работу. Вот как работают среды программирования на основе стека, которые определяют практически все современные компьютерные системы: методы вытесняются в стек вызовов при вызове, выталкиваются, когда они заканчиваются, и когда в стеке ничего не делается, программа завершена.

Даже в вашем коде для вашей программы или формы то, о чем вы просите, совпадает с обходом записи вызывающего в стеке, что эквивалентно (или хуже) использованию GOTO, поскольку оно нарушает основные правила структурированное программирование.

Если вы действительно хотите, чтобы программа была прекращена, вы можете попробовать Environment.Exit(). В противном случае Exit Sub или Return - ваш лучший вариант.

+0

+1 Спасибо за разъяснение этого. Я не хочу выходить из программы. Я просто хочу закрыть текущую форму и вернуться к предыдущей. (По методу «вызывающий» я имею в виду любой метод вызова в текущей форме). –

+0

Добавлен абзац, чтобы сделать вещи еще более ясными. –

+0

Я вижу. Таким образом, невозможно отбросить все методы текущей формы из стека и немедленно закрыть форму? (Я имею в виду что-то вроде 'Application.Exit()', но не распространяется на все приложение) –

1

Как было указано другими, нет более простого шаблона, чем вы опубликовали.

Если у нас есть метод A(), который вызывает метод B() и хочет вызвать Close() из метода B(). В этом случае код в методе A() все равно будет выполнен.

Если вы хотите выйти из MethodA, если форма была закрыта в MethodB, вы можете проверить свойство IsDisposed формы. Это будет True после звонка Form.Close. Кроме того, вы можете проверить свойство Form.Visble в MethodA; это будет False, если форма была закрыта.

Что-то вроде этого:

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

Спасибо, я попробую –

Смежные вопросы