我有一个GUI,其中一个命名管道服务器在Backgroundworker中运行,它从DoWork()事件处理程序中的命名管道获取命令,并与RunWorkerCompleted()事件处理程序中的GUI控件进行交互。 / p>
GUI有时会打开模态窗口,阻止RunWorkerCompleted()事件处理程序运行,直到窗口关闭。
有没有办法让我用命名管道服务器和后台工作程序关闭这些模态窗口?
到目前为止,我发现的最好的事情是这篇文章中的黑客攻击(How to continue executing code after calling ShowDialog()),我将使用Show()和Parent.Enabled = False而不是ShowDialong()。我希望有更清洁的东西。
答案 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