Form.Show与Form.ShowDialog交叉线程

时间:2017-06-22 17:43:45

标签: vb.net multithreading winforms devexpress

我有以下代码关闭loginform并打开mainform

Sub Loadform(ByVal formName As Form)
    Dim Thisform As Form = DirectCast(formName, frmLogIn1)
    Thisform.Hide()
    Dim frm As New frmMain
    frm.ShowDialog() <- Problem
    Thisform.Close()
End Sub

mainform有一个 DevExpress SplashScreenManager,它可以自动加载和卸载启动画面。

当我调用frm.Show时,SplashScreen关闭时会出现跨线程异常。

如果我使用frm.ShowDialog调用它,则可以正常工作。这个新的代码。该应用程序大约12个月大,这个代码在开始时添加,但我现在遇到了问题。

原始代码(取自备份)是:

Me.Hide()
Dim main As New frmMain
main.Show()
Me.Dispose()

但现在似乎正在关闭主体。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不太明白你的问题。你想使用旧代码吗?新的?你想解决什么问题?

好吧,你调用frm.Show()和Thisform.Close()的解释很简单。 当你调用frm.Show()时,新表单在第二个线程上打开,当前表单继续正常执行其代码,逻辑上到达一行代码,它将关闭它的Thisform.Close()。因为它是主窗体,当它关闭时会尝试终止所有其他窗体,因此它会尝试关闭刚刚打开的窗体,因此会发生跨线程异常(请记住新窗体是在另一个线程上运行;) )

但是当你调用frm.ShowDialog()时,操作是不同的。它没有启动新线程,它只是指向新表单,因此ShowDialog之后的任何代码行仅在新论坛关闭时运行;