Приложение VB .NET не завершается, когда закрываются все формы

Я хотел создать приложение с двумя формами, основной из которых называется Source и дочерняя компания под названием Viewer, Используя кнопки на каждой форме, пользователь может переключаться на другую, даже если эта форма ранее была закрыта. Поэтому я установил в моей программе " Закрыть при закрытии последней формы". Более того, я добавил сообщения, когда каждая форма закрылась, просто чтобы убедиться, что пользователь был уверен.

Но теперь мое приложение не закрывается после закрытия обеих форм! Он отображается в диспетчере задач, и если я запускаю его в MSVS, отладчик никогда не останавливается! Когда каждая форма закрыта, My.Application.Forms возвращает пустую коллекцию. И если я заставлю выйти, используя End / Application.Exit, программа все еще выходит - см. MWE ниже. Что я делаю?

MWE

Создайте пустой проект Windows Forms для VB.NET. На вкладке "Приложение" настроек вашего проекта выберите "Закрыть при закрытии последней формы". В конструкторе создайте форму Source с одной кнопкой.

Public Class Source

Public Sub Switch(sender As Object, e As EventArgs) Handles Button1.Click
    My.Forms.Viewer.Show()
End Sub

Public Sub Free(sender As Object, e As FormClosingEventArgs) Handles Me.Closing
    e.Cancel=(MsgBoxResult.Cancel=MsgBox("Are you sure?"))
End Sub

'Public Sub Test(sender As Object, e As EventArgs) Handles Me.Closed
    'Debug.Assert(Not My.Application.Forms.Count))
    'If the next line is uncommented, the application will close, like we want
    'If Not My.Forms.Viewer.Visible Then Application.Exit()
'End Sub

End Class

Затем создайте идентичную форму под названием Viewer,

Public Class Viewer

Public Sub Switch(sender As Object, e As EventArgs) Handles Button1.Click
    My.Forms.Source.Show()
End Sub

Public Sub Free(sender As Object, e As FormClosingEventArgs) Handles Me.Closing
    e.Cancel=(MsgBoxResult.Cancel=MsgBox("Are you sure?"))
End Sub

'Public Sub Test(sender As Object, e As EventArgs) Handles Me.Closed
    'Debug.Assert(Not My.Application.Forms.Count))
    'If the next line is uncommented, the application will close, like we want
    'If Not My.Forms.Source.Visible Then Application.Exit()
'End Sub

End Class

Попробуйте закрыть любую форму последней. Ни один из них не приведет к закрытию приложения.

1 ответ

Не использовать Form.Closing а также Form.Closed

На странице MSDN на Form.Closingзамечает:

предосторожность

Closing событие устарело в.NET Framework версии 2.0 [и выше]; использовать FormClosing событие вместо

События устарели, потому что

Form.Closed а также Form.Closing события не возникают, когда Application.Exit метод вызывается для выхода из приложения. Если у вас есть код проверки в любом из этих событий, которые должны быть выполнены, вы должны вызвать метод Form.Close для каждой открытой формы отдельно, прежде чем вызывать метод Exit.

Документация MSDN нигде не говорит об этом, но верно обратное: чтобы ваша форма сигнализировала среде выполнения VB.NET, что форма закрыта, Form.Closing а также Form.Closed не может быть подписан на

Если вы замените Me.Closing с Me.FormClosing а также Me.Closed с Me.FormClosed в вашем MWE это работает.

Другие вопросы по тегам