VB.NET弹窗冻结后台窗体:需实现弹窗时后台窗体正常运行
解决VB.NET弹出消息框时后台窗体冻结的问题
嘿,我明白你的困扰——弹出那个警告消息框后,后台窗体就冻住了,连Timer都不跑了是吧?这事儿的根源很简单:MessageBox是模态对话框,它一弹出来就会把整个UI线程给堵死,而你两个窗体的Timer都是靠UI线程触发Tick事件的,线程被卡,Timer自然就停摆了,窗体看起来就像冻结了一样。
下面给你两个实用的解决方案,挑适合你的来用:
方案1:用自定义非模态窗体替代MessageBox
最稳妥的办法是自己做个简单的消息窗体,用非模态方式显示,这样不会阻塞UI线程:
- 新建一个Windows窗体(比如叫
CustomMsgBox),拖个Label放消息文本,再放个Button当“OK”按钮。 - 给按钮的Click事件加代码:
Me.Close()就行。 - 把原来的MessageBox代码换成这样:
If dServer_Time > dEndtime AndAlso Not mssg Then a = True Me.WindowState = FormWindowState.Minimized Me.Show() Me.WindowState = FormWindowState.Maximized ' 显示自定义非模态消息框 Dim msgForm As New CustomMsgBox() msgForm.Label1.Text = "Message Text" msgForm.Text = "Header" msgForm.Show() ' 非模态显示,不卡UI线程 End If
这样消息框弹出来后,后台窗体的Timer该跑还是跑,完全不受影响。
方案2:在独立STA线程显示MessageBox(备选方案)
要是不想做自定义窗体,也可以给MessageBox单独开个UI线程——因为UI控件必须在STA线程里运行,所以得这么写:
If dServer_Time > dEndtime AndAlso Not mssg Then a = True Me.WindowState = FormWindowState.Minimized Me.Show() Me.WindowState = FormWindowState.Maximized ' 开个新线程显示消息框 Dim msgThread As New Thread(Sub() MessageBox.Show("Message Text", "Header", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, CType(262144, MessageBoxOptions)) End Sub) msgThread.SetApartmentState(ApartmentState.STA) ' 必须设为STA才能显示UI msgThread.Start() End If
不过这个方案有个小问题:新线程的消息框和主窗体没啥关联,可能会出现焦点乱跑的情况,所以优先推荐方案1哈。
对了,顺便提一句:你代码里先Minimized再Maximized的操作,要是为了激活窗体,其实用Me.Activate()就够了,更简洁高效~
内容的提问来源于stack exchange,提问作者vardefoml
相关产品推荐
相关产品推荐

