从后台线程模态显示 MessageBox

Show MessageBox modaly from background thread

在我的 Winform VB.NET 应用程序中,我正在检查一些字段。如果某个特定字段等于 true,我需要显示消息。通常它会是这样的:

If (myField) Then
     MessageBox.Show("Something is wrong", "Warning", MessageBoxButtons.OK)

    // continuing...
End If

此消息必须以模式显示(用户只能在单击“确定”按钮后 return 到主窗体)。问题是我不希望线程等待点击(只显示消息并继续 - 不要等待 OK 按钮)。

我唯一的想法是在后台线程中显示消息:

If (myField) Then
     Dim t As Thread = New Thread(AddressOf ShowMyMessage)
     t.Start()

     // continuing...
End If

Private Sub ShowMyMessage()
     MessageBox.Show("Something is wrong", "Warning", MessageBoxButtons.OK)
End Sub

但在这种情况下,消息不会以模态显示(用户可以 return 到主窗体并与其交互,而无需单击“确定”按钮)。

有什么想法吗?

如果这是你想要做的,你的设计很可能是错误的,但作为练习,我写了一些应该实现你想要的东西。

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    Dim thr As New Thread(Sub() ThreadTest())
    thr.Start()
End Sub

Private Sub ThreadTest()
    Debug.WriteLine("Started")
    Me.ShowMessageBox("Can't click on the main form now", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    Debug.WriteLine("Thread continued")
End Sub

Public Sub ShowMessageBox(textToShow As String, caption As String, buttons As MessageBoxButtons, icon As MessageBoxIcon)
    Me.BeginInvoke(Sub() MessageBox.Show(textToShow, caption, buttons, icon))
End Sub

当您 运行 它时,您会看到 ThreadTest 代码继续显示消息框,但在消息框上单击确定之前不允许与主窗体进行交互