我目前正在学习VB.NET,我对使用线程打开表单有疑问。
例如,当我点击打开按钮时,胎面将启动并打开另一个表单以添加或更改数据。
因此,我试图实现这个部分,如
Private Sub menu_Click(sender As Object, e As EventArgs) Handles menu.Click
Dim A As System.Threading.Thread = New Threading.Thread(AddressOf Task_A)
A.Start()
End Sub
Public Sub Task_A()
frmBuild.Show()
End Sub
但是,我错误地通过线程打开frmBuild
。我是否需要使用其他方法打开表单?
而且,当fromBuild关闭时我们如何杀死线程?
答案 0 :(得分:15)
这几乎总是一个坏主意。您不应该尝试使用单独的线程来打开Form
- 而是在主UI线程上打开所有表单,并移动否则会阻塞到后台线程的“工作”。 BackgroundWorker
是处理工作的常用方法。
话虽如此,如果你出于某种不寻常的原因需要这样做,你还需要做其他两件事。
首先,您需要设置该线程的单元状态。您还需要使用Application.Run
来显示表单,并且必须在适当的主题上创建该表单:
Private Sub menu_Click(sender As Object, e As EventArgs) Handles menu.Click
Dim th As System.Threading.Thread = New Threading.Thread(AddressOf Task_A)
th.SetApartmentState(ApartmentState.STA);
th.Start()
End Sub
Public Sub Task_A()
frmBuild = New YourForm() ' Must be created on this thread!
Application.Run(frmBuild)
End Sub
要从其他线程关闭Form,您可以使用:
frmBuild.BeginInvoke(New Action(Sub() frmBuild.Close()))
而且,当fromBuild关闭时我们如何杀死线程?
如果表格如上所示,则表格将在表格关闭时自动关闭。