在我的表单构造函数中,我调用:
InitializeComponent(); // boilerplate placed by VS, initializing controls
label1.BeginInvoke(new InvokeDelegate(RefreshLabelDelegate));
然而,我得到了一个可怕的例外消息:
在窗口之前,无法在控件上调用Invoke或BeginInvoke 句柄已创建“
AFAIK,它是完全相同的线程,为什么例外?
答案 0 :(得分:4)
将label1.BeginInvoke
从构造函数移动到Form_Load
事件处理程序。
答案 1 :(得分:4)
本机窗口句柄在构造函数中创建而不是。直到稍后,在调用窗体的Show()方法之后才会发生这种情况。在典型的.NET懒惰时尚。 Load事件是在创建后运行的第一个标准事件。还有HandleCreated事件,但它可能会运行多次。
在这里实际上不太可能需要使用BeginInvoke,它意味着用于在创建Label1控件的线程上运行代码。构造函数应该已经在该线程上运行,如果不是,那么它是非常不健康的。如果打算绘制标签,则使用Form的已显示事件,即在表单实际对用户可见之后运行的第一个事件。
答案 2 :(得分:2)
尚未创建句柄(为什么说它是)。手柄不是在构造时创建的 - 它是延迟的。您可以通过访问控件的.Handle
属性来强制创建句柄来解决此问题。
以下内容可能会有所帮助:
答案 3 :(得分:0)
不要调用BeginInvoke,没有理由。在控件的构造函数中,最好已经在相应的UI线程上。