Vb.net 调用Application.Run(New myForm())在Sub Main外部时不工作

Vb.net 调用Application.Run(New myForm())在Sub Main外部时不工作,vb.net,compact-framework,Vb.net,Compact Framework,我正在符号MC50上使用Compact Framework 3.5 在我的Sub-Main中,它首先检查数据库是否存在。如果是,则显示使用以下代码的登录屏幕: Dim login As frmLogin = New frmLogin() If login.ShowDialog() = DialogResult.OK Then Application.Run(New frmMain()) End If If SystemUserSecuri

我正在符号MC50上使用Compact Framework 3.5

在我的Sub-Main中,它首先检查数据库是否存在。如果是,则显示使用以下代码的登录屏幕:

Dim login As frmLogin = New frmLogin()
    If login.ShowDialog() = DialogResult.OK Then            
        Application.Run(New frmMain())
    End If
If SystemUserSecurityId() = Nothing Then
        Dim login As frmLogin = New frmLogin()
        If login.ShowDialog() = DialogResult.OK Then
            DebugTrace("Init - login complete, starting application.")
            Application.Run(New frmMain())
        End If
    End If
    Me.Hide()
这一切都正常工作,当我关闭frmMain时,它会按预期退出应用程序

但是,如果数据库签入子Main失败,我将调用另一个表单的ShowDialog()方法,该表单用于从实时服务器创建和填充数据库。以下是调用此表单的代码:

If Not File.Exists(SETTINGS_LOCALDB) Then
        databaseExists = False
        MessageBox.Show("Local DB does not exist. The database must be created before using the application.")
        Dim update As frmUpdateData = New frmUpdateData()
        update.ShowDialog()
Else
    .....
End If
我遇到的第一个问题是,当frmUpdateData关闭时,Sub Main中的其余代码没有执行,因此Application.Run从未被命中

因此,在frmUpdateData上关闭按钮的单击事件中,我添加了以下代码:

Dim login As frmLogin = New frmLogin()
    If login.ShowDialog() = DialogResult.OK Then            
        Application.Run(New frmMain())
    End If
If SystemUserSecurityId() = Nothing Then
        Dim login As frmLogin = New frmLogin()
        If login.ShowDialog() = DialogResult.OK Then
            DebugTrace("Init - login complete, starting application.")
            Application.Run(New frmMain())
        End If
    End If
    Me.Hide()
所有这些代码都被命中,frmMain确实加载了。但是,当我单击右上角的“关闭”按钮时,不会发生任何事件。就好像Windows事件没有发生一样


我做错了什么?

我看不出您的整个应用程序是如何组合在一起的,但我将通过删除“else”条款来提出这一小改动:


主窗体无法关闭的原因是您的应用程序被“卡住”在对话框关闭事件的调用堆栈中,因为这是您启动主窗体的windows消息循环的地方

我建议您重新构造代码

不要在“主”子窗体中进行有效性检查,而是加载主窗体:

Application.Run(New frmMain())
在主窗体上放置一个计时器,并设置一个非常快的间隔(比如10毫秒)。在主窗体的加载事件中启用它。像这样实现Tick事件处理程序(请注意,我的VB语法可能并不完美,我在这里使用它):


我不确定这是否有用,但我会尝试使用Application.Run来显示您的frmLogin和frmUpdate数据表单,而不是调用ShowDialog。我不知道当您不在应用程序消息循环中时.NET对您显示对话框和消息框有多友好。