跨线程操作-VB.NET
我正在创建一个类,每当调用“new”时,它都会创建一个已存在表单的新实例。我在一个类库中实现它,类库有一个“WndClass”(类)和一个“MainWindow”(窗体)。问题是,每当我试图通过InsWindow关闭窗口时,就会出现上述错误。关闭 代码如下:跨线程操作-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
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
是放置此代码的正确位置。