跨线程操作-VB.NET

跨线程操作-VB.NET,vb.net,Vb.net,我正在创建一个类,每当调用“new”时,它都会创建一个已存在表单的新实例。我在一个类库中实现它,类库有一个“WndClass”(类)和一个“MainWindow”(窗体)。问题是,每当我试图通过InsWindow关闭窗口时,就会出现上述错误。关闭 代码如下: Public Class WndClass Public Shared WindowCount As Integer Private InsWindow As MainWindow Public Sub New() W

我正在创建一个类,每当调用“new”时,它都会创建一个已存在表单的新实例。我在一个类库中实现它,类库有一个“WndClass”(类)和一个“MainWindow”(窗体)。问题是,每当我试图通过InsWindow关闭窗口时,就会出现上述错误。关闭

代码如下:

Public Class WndClass
   Public Shared WindowCount As Integer
   Private InsWindow As MainWindow

Public Sub New()
    WindowCount += 1
    InsWindow = New MainWindow
    InsWindow.Show()
End Sub

'.... Some window manipulation functions

Protected Overrides Sub Finalize()
    WindowCount -= 1
    InsWindow.Close()
    InsWindow.Dispose()
    MyBase.Finalize()
End Sub
End Class
我对这门语言还相当陌生,所以我决定去试验和编写随机出现在我脑海中的想法


编辑:我读过一些类似但不一定相同的问题,其中一些人说是代表解决了问题,有人能解释一下我如何使用它来解决这个问题吗?

在不知道错误的情况下,我只能在黑暗中试一试

鉴于您提到了代表,我建议您尝试以下方法:

Protected Overrides Sub Finalize()

    If Me.InvokeRequired Then
        Me.Invoke(New MethodInvoker(AddressOf Me.Finalize))
    Else
        WindowCount -= 1
        InsWindow.Close()
        InsWindow.Dispose()
        MyBase.Finalize()
    End If

End Sub
委托
在您需要更改运行代码的线程时使用(即:您需要返回UI线程)

通常,您必须创建一个委托(即:
私有委托子测试(val1作为字符串,val2作为字符串,等等)
),然后调用委托,同时向其传递希望调用的方法的地址(注意:委托的变量必须与被调用的方法匹配)

如果没有向方法传递变量,您可以调用
MethodInvoker
,比如
Me.invoke(newmethodinvoker(AddressOf Me.Foo))


请记住,通过检查
Me.invokererequired

始终检查是否需要调用是一种很好的做法。您是否尝试过这种方法?在调用
Finalize
时,这样一个方法中的代码以合理的方式与其他托管对象对话已经太晚了。它仅用于清理非托管资源(例如通过P/Invoke调用分配的资源)。我不能提供任何更具体的建议,除非您能说明为什么您认为
Finalize
是放置此代码的正确位置。