使用BackgroundWorker关闭模态窗口

时间:2015-03-04 23:05:25

标签: vb.net backgroundworker showdialog

我有一个GUI,其中一个命名管道服务器在Backgroundworker中运行,它从DoWork()事件处理程序中的命名管道获取命令,并与RunWorkerCompleted()事件处理程序中的GUI控件进行交互。 / p>

GUI有时会打开模态窗口,阻止RunWorkerCompleted()事件处理程序运行,直到窗口关闭。

有没有办法让我用命名管道服务器和后台工作程序关闭这些模态窗口?

到目前为止,我发现的最好的事情是这篇文章中的黑客攻击(How to continue executing code after calling ShowDialog()),我将使用Show()和Parent.Enabled = False而不是ShowDialong()。我希望有更清洁的东西。

1 个答案:

答案 0 :(得分:1)

将方法放在可以在辅助线程上调用的模态形式,例如

Public Sub CloseFromBackground()
    If Me.InvokeRequired Then
        Me.Invoke(New MethodInvoker(AddressOf CloseFromBackground))
    Else
        Me.Close()
    End If
End Sub

您显然需要引用该表单来调用它,因此您无法将其分配给本地变量。我猜您可以从OpenForms集合中获取引用。如果您这样做,那么您可以使用每个表单的Modal属性来确定哪个以模态显示。

E.g。

Imports System.Threading

Public Class Form1

    Private f2 As Form2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.BackgroundWorker1.RunWorkerAsync()

        Me.f2 = New Form2()
        Me.f2.ShowDialog()
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Thread.Sleep(2000)
        Me.f2.CloseFromBackground()
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        MessageBox.Show("Done!")
    End Sub
End Class


Public Class Form2

    Public Sub CloseFromBackground()
        If Me.InvokeRequired Then
            Me.Invoke(New MethodInvoker(AddressOf CloseFromBackground))
        Else
            Me.Close()
        End If
    End Sub

End Class