交叉线程操作 - VB.NET



>我正在创建一个类,每次调用"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 线程)时,将使用Delegates

通常,您必须创建一个委托(即:Private Delegate Sub Test(val1 As String, val2 As String, etc..)),然后调用委托,同时向其传递要调用的方法的地址(注意:委托的变量必须与被调用的方法匹配)。

如果没有变量传递给该方法,您可以像这样调用MethodInvoker Me.Invoke(New MethodInvoker(AddressOf Me.Foo))...

请记住,最好始终通过检查Me.InvokeRequired来检查是否需要调用

最新更新