2013-10-23 40 views
0

我正在創建一個已經存在的形式,每一次「新」之稱的新實例的類。我在一個類庫實現這一點,類庫有一個「WNDCLASS」(類)和「主窗口」(表格)。問題是我得到上述錯誤,每當我試圖通過InsWindow.Close橫紗操作 - VB.NET

關閉窗口

下面的代碼:

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 

我是相當新的語言,所以我決定去嘗試和編碼隨機的想法出現在我的腦海裏。

編輯:我讀了一些類似的,但不一定是同樣的問題,有的人說是代表什麼解決的問題,有人可以解釋我是如何用它來解決這個問題?

+0

需要一個調用要經常檢查你有沒有試過這種[鏈接](http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the)? – Edper

+0

的時候'Finalize'被調用時,它來得太遲了代碼,這樣的方法在裏面一個合理的方式來談論其他管理對象。它僅用於清理非託管資源(例如通過P/Invoke調用分配的資源)。除非你能說出爲什麼你認爲'Finalize'是放這段代碼的正確位置,否則我無法提供任何更具體的建議。 –

回答

0

不知道的錯誤,我只能採取瞎猜...

你所提到的代表的事實,我會建議您嘗試以下操作:

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 

Delegates使用時你需要改變代碼運行的線程(即:你需要回到UI線程)。

通常,您必須創建一個委託(即:Private Delegate Sub Test(val1 As String, val2 As String, etc..)),然後在調用委託的同時向其傳遞您希望調用的方法的地址(注意:委託的變量必須與被調用的方法相匹配)。

如果沒有被傳遞給方法的變量,你可以調用MethodInvoker像這樣Me.Invoke(New MethodInvoker(AddressOf Me.Foo)) ...

請記住這是很好的做法,如果是通過檢查Me.InvokeRequired