【问题标题】:Show MessageBox modaly from background thread从后台线程显示 MessageBox 模式
【发布时间】:2015-04-16 07:41:27
【问题描述】:

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

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

    // continuing...
End If

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

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

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

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

有什么想法吗?

【问题讨论】:

  • 在 UI 线程中显示消息框。为什么这里需要一个工作线程?
  • 因为 UI 线程在消息上停止。我后面有一些代码,只有在关闭消息后才会执行
  • 这就是模态对话框的意思。你有 XY Problem 代替原来的问题。

标签: vb.net winforms messagebox ui-thread background-thread


【解决方案1】:

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

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 代码在消息框显示之后继续进行,但在单击消息框上的确定之前不允许与主窗体交互

【讨论】:

  • 我知道设计不行。 BeginInvoke 正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2016-01-24
  • 2014-07-22
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
相关资源
最近更新 更多