6

我目前正在学习 VB.NET,我有关于使用线程打开表单的问题。

例如,当我单击打开按钮时,tread 将启动并打开另一个表单以添加或更改数据。

因此,我尝试实现这部分,例如

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

但是,我在打开frmBuildby 线程时遇到错误。我需要使用其他方法打开表单吗?

而且,当 fromBuild 关闭时,我们如何杀死线程?

4

1 回答 1

20

这几乎总是一个坏主意。您不应该尝试使用单独的线程来打开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

为了从另一个线程关闭表单,您可以使用:

frmBuild.BeginInvoke(New Action(Sub() frmBuild.Close()))

而且,当 fromBuild 关闭时,我们如何杀死线程?

如果按照上面的写法,当窗体关闭时线程会自动关闭。

于 2013-10-25T17:38:44.217 回答