這是我的情況,有2個班,我的主窗體Form1:VB.NET調用可以到窗口句柄已創建不能在一個控件調用,但手柄創建
Class1的:有一個方法doSomethingAndCall(回調),它創建了一個新的線程 類2:具有動態創建的控件有一個按鈕,觸發Class1.doSomethingAndCall(newCallback)
代碼它看起來像這樣(它開始於Class2.Button_Click):
Class Class1
public shared sub doSomethingAndCallAsync(state as object)
Console.WriteLine(Form1.InvokeRequired) 'output: false
Console.WriteLine(Form1.IsHandleCreated) 'output: false
Form1.Invoke(state.callback) 'throws System.InvalidOperationException
end sub
public shared sub doSomethingAndCall(callback as object)
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf doSomethingAndCallAsync, New With {.callback = callback})
end sub
End Class
Class Class2
Public Delegate Sub doSomethingDelegate()
Public Sub doSomething()
Console.WriteLine("success!")
End Sub
Public Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Class1.doSomethingAndCall(New doSomethingDelegate(AddressOf doSomething))
End Sub
End Class
ex行爲例外,我得到的是:
調用或BeginInvoke可直到窗口句柄已創建
不能在控制打來電話,我可以看到Console.WriteLine命令行中4顯示我,形式是真的沒有創建。所以我說這個處理程序,現在它得到的真正困惑:
Private Sub Form1_HandleCreated(sender As Object, e As System.EventArgs) Handles Me.HandleCreated
Console.WriteLine("Handle created") 'Output: Handle created, when running program
End Sub
Private Sub Form1_HandleDestroyed(sender As Object, e As System.EventArgs) Handles Me.HandleDestroyed
Console.WriteLine("Handle destroyed") 'Will never Output!
End Sub
所以它的創建和銷燬從來沒有,但如果我按一下按鈕它仍然不是avaible? - 任何人都可以解釋我發生了什麼以及如何調用回調正確,謝謝!
什麼是state.callback,它是做什麼的? – Derek 2014-09-03 13:00:33
你確定你正在使用Form1的實例嗎?它看起來像是在說一個類型的'Form1.Invoke',而不是那種類型的實例。 – JoelC 2014-09-03 13:11:48
@Derek:當使用線程池時,只能向線程傳遞1個參數(作爲對象),這是狀態。但是,如果您必須傳遞多於1個參數,則可以執行如下操作:New With {.callback = callback}。所以可以傳遞大量的參數。在我的例子中,回調函數是new doSomethingDelegate(AddressOf doSomething),我想在doSomethingAndCallAsync中調用它。如果你或其他人知道更好的方式,請告訴我:) – MaBi 2014-09-03 13:27:12