这是我的情况,有2个班级和我的主要表格Form1:
Class1:有一个方法 doSomethingAndCall(callback) ,它创建一个新线程
Class2:具有动态创建的控件,带有触发 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
我得到的确切异常是:
在创建窗口句柄之前,无法在控件上调用 Invoke 或 BeginInvoke
正如我所看到的,第 4 行中的 console.WriteLine 表明该表单实际上并未创建。所以我添加了这个处理程序,现在它变得非常混乱:
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
所以它被创建并且从未被销毁,但是如果我单击按钮它仍然不可用? -任何人都可以解释一下发生了什么事以及如何正确调用回调,谢谢!